golang sql 的使用
使用 statement 增加数据
使用db.Prepare
获取一个 sql 执行模板,其中的?
为需要输入的参数,之后通过stmt.Exec()
添加参数。
Exec
返回的Result
可以获取 LastInsertId(),但是并不是所有数据库都支持;RowsAffected()
能够获取修改数据的条数。
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
res, err := stmt.Exec("Dolly")
if err != nil {
log.Fatal(err)
}
lastId, err := res.LastInsertId()
if err != nil {
log.Fatal(err)
}
rowCnt, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)
如果同时修改多条数据,可以使用 transaction
使用 transaction 的步骤为db.Begin()
, tx.Commit()
/tx.Rollback()
,需要注意的是 stmt 需要调用 Close()释放数据库连接数,而 tx
不需要 Close()
, tx
在调用 Commit()
或者 Rollback()
时,会自动释放资源。
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer tx.Rollback()
stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close() // danger!
for i := 0; i < 10; i++ {
_, err = stmt.Exec(i)
if err != nil {
log.Fatal(err)
}
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}