Golang 操作Mysql個人總結

2021-10-05 21:24:22 字數 3518 閱讀 7752

此文寫在剛起步學習golang,目前剛看到go/mysql 這一塊,初步使用後,發現了一些小坑,記錄一下,以免日後再次在這一塊踩坑了。學習文章參考於go語言學習之路|李文周的部落格,這一篇部落格寫的非常好,十分適合初步學習go或者剛轉型go的朋友進行學習。

go語言中的database/sql包提供了保證sql或類sql資料庫的泛用介面,並不提供具體的資料庫驅動。使用database/sql包時必須注入(至少)乙個資料庫驅動。

我們常用的資料庫基本上都有完整的第三方實現。例如:mysql驅動

sql.open開啟乙個dirvername指定的資料庫,datasourcename指定資料來源,一般至少包括資料庫檔名和其它連線必要的資訊。

func

open

(drivername, datasourcename string)(

*db,

error

)

open函式可能只是驗證其引數格式是否正確,實際上並不建立與資料庫的連線。如果要檢查資料來源的名稱是否真實有效,應該呼叫ping方法。

返回的db物件可以安全地被多個goroutine併發使用,並且維護其自己的空閒連線池。因此,open函式應該僅被呼叫一次,很少需要關閉這個db物件。

)var db *sql.db // 定義全域性物件db

func

init()

db.setmaxopenconns

(1000

)// 設定最大連線數

err :=db.

ping()

// 嘗試與資料庫建立連線

if err !=

nil}

// dbconn:返回資料連線物件

func

dbconn()

*sql.db.

什麼是預處理?

普通sql語句執行過程:

客戶端對sql語句進行佔位符替換得到完整的sql語句。

客戶端傳送完整sql語句到mysql服務端

mysql服務端執行完整的sql語句並將結果返回給客戶端

預處理執行過程:

把sql語句分成兩部分,命令部分與資料部分。

先把命令部分傳送給mysql服務端,mysql服務端進行sql預處理

然後把資料部分傳送給mysql服務端,mysql服務端對sql語句進行佔位符替換。

mysql服務端執行完整的sql語句並將結果返回給客戶端。

為什麼要預處理?
實現
//從資料庫獲取檔案元資訊

func

getfilemeta

(filehash string)(

*tablefile,

error

)defer stmt.

close()

tfile := tablefile

// 這裡打算把後續的值賦值給結構體

//queryrow單行查詢

err = stmt.

queryrow

(filehash)

.scan

(&tfile.filehash,

&tfile.fileaddr,

&tfile.filename,

&tfile.filesize)

if err!=

nilreturn

&tfile,err

}

.

func

(db *db)

queryrow

(query string

, args ...

inte***ce

)*row

關鍵**:(錯誤判斷省略)

//先通過預處理

stmt,err := mysql.

dbconn()

.prepare

("select * where name=? "

)var u user

//然後使用queryrow單行查詢,將查詢結果通過scan對應賦值

err = stmt.

queryrow

(username)

.scan

(&u.id,

&u.name,

&u.age)

.

func

(db *db)

query

(query string

, args ...

inte***ce)(

*rows,

error

)

關鍵**:(錯誤判斷省略)

stmt,err := mysql.

dbconn()

.prepare

("select * where name=? "

)rows,err = stmt.

query

(username)

defer rows.

close()

// 延遲關閉rows

for rows.

next()

增、刪、改

插入、更新和刪除操作都使用exec方法。

func

(db *db)

exec

(query string

, args ...

inte***ce

)(result,

error

)

exec執行一次命令(包括查詢、刪除、更新、插入等),返回的result是對已執行的sql命令的總結。引數args表示query中的佔位引數。

關鍵**:(錯誤判斷省略)

stmt,err := mysql.

dbconn()

.prepare

("insert into user(name,age) value (?,?) "

)ret,err := stmt.

exec

("***"

,"18"

)if rf,err := ret.

rowsaffected()

;nil

==err

return

true

}

個人MYSQL操作記錄

修改一列的預設值 alter table 表名 alter column 列名 set default 值 重設id自增計數 清空表資料,然後使用如下命名,truncate table 表名 設定外來鍵 alter table 表名 add constraint 外鍵名 foreign key 表中...

golang操作mysql資料庫

golang中僅僅定義了連線mysql資料庫介面,沒有具體實現mysql的驅動,因此我們需要使用github上最流行的乙個庫 命令列輸入 go get u github.com go sql driver mysql 新建乙個資料庫dada creatu database dada use dada...

golang操作mysql資料庫

golang操作mysql資料庫 mysql的增 刪 改 查 遍歷返回結果 forrows.next func insert id int,db sql.db func delete id int,db sql.db func update id int,name string,db sql.db ...