go連線mysql GO連線MySQL

2021-10-25 14:37:11 字數 4623 閱讀 5623

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...