此文寫在剛起步學習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 ...