// 查詢單條數據示例funcqueryRowDemo(){sqlStr :="select id, name, age from user where id=?"var u user// 非常重要:確保QueryRow之后調用Scan方法,否則持有的數據庫鏈接不會被釋放err := db.QueryRow(sqlStr,1).Scan(&u.id,&u.name,&u.age)if err !=nil{fmt.Printf("scan failed, err:%v\n", err)return}fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)}
// 事務操作示例functransactionDemo(){tx, err := db.Begin()// 開啟事務if err !=nil{if tx !=nil{tx.Rollback()// 回滾}fmt.Printf("begin trans failed, err:%v\n", err)return}sqlStr1 :="Update user set age=30 where id=?"_, err = tx.Exec(sqlStr1,2)if err !=nil{tx.Rollback()// 回滾fmt.Printf("exec sql1 failed, err:%v\n", err)return}sqlStr2 :="Update user set age=40 where id=?"_, err = tx.Exec(sqlStr2,4)if err !=nil{tx.Rollback()// 回滾fmt.Printf("exec sql2 failed, err:%v\n", err)return}err = tx.Commit()// 提交事務if err !=nil{tx.Rollback()// 回滾fmt.Printf("commit failed, err:%v\n", err)return}fmt.Println("exec trans success!")}
5. sqlx使用
第三方庫sqlx能夠簡化操作,提高開發效率。
1. 安裝
go get github.com/jmoiron/sqlx
2. 基本使用
2.1 連接數據庫
var db *sqlx.DBfuncinitDB()(err error){dsn :="user:password@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"// 也可以使用MustConnect連接不成功就panicdb, err = sqlx.Connect("mysql", dsn)if err !=nil{fmt.Printf("connect DB failed, err:%v\n", err)return}db.SetMaxOpenConns(20)db.SetMaxIdleConns(10)return}
2.2 查詢
由于sqlx是通過反射獲取對應信息的,所以定義的user結構體元素首字母需要大寫:
type user struct{Id intName stringAge int}
源碼:
查詢單行數據示例代碼如下:
// 查詢單條數據示例funcqueryRowDemo(){sqlStr :="select id, name, age from user where id=?"var u usererr := db.Get(&u, sqlStr,1)if err !=nil{fmt.Printf("get failed, err:%v\n", err)return}fmt.Printf("id:%d name:%s age:%d\n", u.ID, u.Name, u.Age)}
查詢多行數據示例代碼如下:
// 查詢多條數據示例funcqueryMultiRowDemo(){sqlStr :="select id, name, age from user where id > ?"var users []usererr := db.Select(&users, sqlStr,0)if err !=nil{fmt.Printf("query failed, err:%v\n", err)return}fmt.Printf("users:%#v\n", users)}
2.3 插入、更新和刪除
sqlx中的exec方法與原生sql中的exec使用基本一致:
// 插入數據funcinsertRowDemo(){sqlStr :="insert into user(name, age) values (?,?)"ret, err := db.Exec(sqlStr,"沙河小王子",19)if err !=nil{fmt.Printf("insert failed, err:%v\n", err)return}theID, err := ret.LastInsertId()// 新插入數據的idif err !=nil{fmt.Printf("get lastinsert ID failed, err:%v\n", err)return}fmt.Printf("insert success, the id is %d.\n", theID)}// 更新數據funcupdateRowDemo(){sqlStr :="update user set age=? where id = ?"ret, err := db.Exec(sqlStr,39,6)if err !=nil{fmt.Printf("update failed, err:%v\n", err)return}n, err := ret.RowsAffected()// 操作影響的行數if err !=nil{fmt.Printf("get RowsAffected failed, err:%v\n", err)return}fmt.Printf("update success, affected rows:%d\n", n)}// 刪除數據funcdeleteRowDemo(){sqlStr :="delete from user where id = ?"ret, err := db.Exec(sqlStr,6)if err !=nil{fmt.Printf("delete failed, err:%v\n", err)return}n, err := ret.RowsAffected()// 操作影響的行數if err !=nil{fmt.Printf("get RowsAffected failed, err:%v\n", err)return}fmt.Printf("delete success, affected rows:%d\n", n)}