go語言沒有提供官方的資料庫驅動,所以要安裝第三方函式庫。
多行查詢
多行查詢db.query()執行一次查詢,返回多行結果(即rows),一般用於執行select命令。引數args表示query中的佔位引數。
具體示例**:
//查詢多條資料示例
func querymultirowdemo()
fmt.printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
插入資料
插入、更新和刪除操作都使用方法。
exec執行一次命令(包括查詢、刪除、更新、插入等),返回的result是對已執行的sql命令的總結。引數args表示query中的佔位引數。
具體插入資料示例**如下:
//插入資料
func insertrowdemo()
theid, err := ret.lastinsertid() //新插入資料的id
if err !=nil
fmt.printf("insert success, the id is %d.\n", theid)
更新資料
具體更新資料示例**如下:
//更新資料
func updaterowdemo()
n, err := ret.rowsaffected() //操作影響的行數
if err !=nil
fmt.printf("update success, affected rows:%d\n", n)
刪除資料
具體刪除資料的示例**如下:
//刪除資料
func deleterowdemo()
n, err := ret.rowsaffected() //操作影響的行數
if err !=nil
fmt.printf("delete success, affected rows:%d\n", n)
mysql預處理
什麼是預處理?
普通sql語句執行過程:
客戶端對sql語句進行佔位符替換得到完整的sql語句。
客戶端傳送完整sql語句到mysql服務端
mysql服務端執行完整的sql語句並將結果返回給客戶端。
預處理執行過程:
把sql語句分成兩部分,命令部分與資料部分。
先把命令部分傳送給mysql服務端,mysql服務端進行sql預處理。
然後把資料部分傳送給mysql服務端,mysql服務端對sql語句進行佔位符替換。
mysql服務端執行完整的sql語句並將結果返回給客戶端。
為什麼要預處理?
優化mysql伺服器重複執行sql的方法,可以提公升伺服器效能,提前讓伺服器編譯,一次編譯多次執行,節省後續編譯的成本。
避免sql注入問題。
go實現mysql預處理
go中的
prepare方法會先將sql語句傳送給mysql服務端,返回乙個準備好的狀態用於之後的查詢和命令。返回值可以同時執行多個查詢和命令。
查詢操作的預處理示例**如下:
//預處理查詢示例
func preparequerydemo()
defer stmt.close()
rows, err := stmt.query(0)if err !=nil
defer rows.close()//迴圈讀取結果集中的資料
forrows.next()
fmt.printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
插入、更新和刪除操作的預處理十分類似,這裡以插入操作的預處理為例:
//預處理插入示例
func prepareinsertdemo()
defer stmt.close()
_, err= stmt.exec("小王子", 18)if err !=nil
_, err= stmt.exec("沙河娜扎", 18)if err !=nil
fmt.println("insert success.")
go實現mysql事務
事務相關方法
go語言中使用以下三個方法實現mysql中的事務操作。 開始事務
func (db *db) begin() (*tx, error)
提交事務
func (tx *tx) commit() error
回滾事務
func (tx *tx) rollback() error
事務示例
下面的**演示了乙個簡單的事務操作,該事物操作能夠確保兩次更新操作要麼同時成功要麼同時失敗,不會存在中間狀態。
//事務操作示例
func transactiondemo()
sqlstr1 := "update user set age=30 where id=?"_, err= tx.exec(sqlstr1, 2)if err !=nil
sqlstr2 := "update user set age=40 where id=?"_, err= tx.exec(sqlstr2, 4)if err !=nil
err= tx.commit() //提交事務
if err !=nil
fmt.println("exec trans success!")
sqlx使用
第三方庫sqlx能夠簡化操作,提高開發效率。
安裝基本使用
連線資料庫
var db *sqlx.db
func initdb() (err error)
db.setmaxopenconns(20)
db.setmaxidleconns(10)return}
查詢查詢單行資料示例**如下:
//查詢單條資料示例
func queryrowdemo()
fmt.printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
查詢多行資料示例**如下:
//查詢多條資料示例
func querymultirowdemo()
fmt.printf("users:%#v\n", users)
插入、更新和刪除
sqlx中的exec方法與原生sql中的exec使用基本一致:
//插入資料
func insertrowdemo()
theid, err := ret.lastinsertid() //新插入資料的id
if err !=nil
fmt.printf("insert success, the id is %d.\n", theid)
//更新資料
func updaterowdemo()
n, err := ret.rowsaffected() //操作影響的行數
if err !=nil
fmt.printf("update success, affected rows:%d\n", n)
//刪除資料
func deleterowdemo()
n, err := ret.rowsaffected() //操作影響的行數
if err !=nil
fmt.printf("delete success, affected rows:%d\n", n)
事務操作
對於事務操作,我們可以使用sqlx中提供的db.beginx()和tx.mustexec()方法來簡化錯誤處理過程。示例**如下:
func transactiondemo()
sqlstr1 := "update user set age=40 where id=?"tx.mustexec(sqlstr1,2)
sqlstr2 := "update user set age=50 where id=?"tx.mustexec(sqlstr2,4)
err= tx.commit() //提交事務
if err !=nil
fmt.println("exec trans success!")
注意事項
sql中的佔位符
不同的資料庫中,sql語句使用的佔位符語法不盡相同。
資料庫佔位符語法
mysql
postgresql
$1, $2等
sqlite
? 和$1
oracle
:name
sql注入
我們任何時候都不應該自己拼接sql語句!
這裡我們演示乙個自行拼接sql語句的示例,編寫乙個根據name欄位查詢user表的函式如下:
//sql注入示例
func sqlinjectdemo(name string) for _, u :=range users {
fmt.printf("user:%#v\n", u)
此時以下輸入字串都可以引發sql注入問題:
go連線mysql Go語言之高階篇連線mysql
一 go連線mysql 1 mysql驅動 說明 sql.open 函式用來開啟乙個註冊過的資料庫驅動,go mysql driver中註冊了 mysql這個資料庫驅動,第二個引數是dns,它是go mysql driver定義的一些資料庫鏈結和配置資訊。或 在cmd中執行安裝命令 3 建立資料庫 ...
qtp連線mysql 無驅動 QTP連線MySQL
1 安裝 connector odbc 2 檢視資料來源名稱 控制面板 管理工具 資料來源 odbc 新增 3 連線資料庫 dim conn,connstring 建立資料庫例項 set conn createobject adodb.connection 連線字串 connstring drive...
qtp連線mysql 無驅動 QTP連線MySQL
1 安裝 connector odbc 2 檢視資料來源名稱 控制面板 管理工具 資料來源 odbc 新增 3 連線資料庫 dim conn,connstring 建立資料庫例項 set conn createobject adodb.connection 連線字串 connstring drive...