Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能:
sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作.
sql.DB 为我们管理 数据库连接池
查询的一般步骤如下:
调用 db.Query 执行 SQL 语句, 此方法会返回一个 Rows 作为查询的结果
通过 rows.Next() 迭代查询数据.
通过 rows.Scan() 读取每一行的值
通过 db.Exec()执行INSERT, UPDATE, DELETE操作
调用 db. Close () 关闭查询
通过使用预编译Prepare实现增删改查操作,开发中经常使用。
stmt, _ := dbw.Db.Prepare(`INSERT INTO user (name, age) VALUES (?, ?)`)
defer stmt.Close()
ret, err := stmt.Exec(“xys”, 23)
db.Prepare()返回的 statement 使用完之后需要手动关闭,即defer stmt.Close()
导入 mysql 数据库驱动
import (
“database/sql”
_ “github.com/go-sql-driver/mysql” //匿名导入的方式(在包路径前添加 _)
)
连接数据库
db, err := sql.Open(“mysql”, “root:@tcp(127.0.0.1:3306)/ test ? charset =utf8″);
sql.Open函数:func Open(driverName, dataSourceName string) (*DB, error)
查询遍历:
//查询数据,指定字段名,返回sql.Rows结果集
rows, _ := db.Query(“select id,name from test”);
id := 0;
name := “”;
for rows.Next() {
rows.Scan(&id, &name);
fmt.Println(id, name);
}
插入数据
ret, _ := db.Exec(“insert into test(id,name) values(null, ‘444’)”);
ins_id, _ := ret.LastInsertId();
更新数据
ret2, _ := db.Exec(“update test set name = ‘000’ where id > ?”, 2);
aff_nums, _ := ret2.RowsAffected();
删除数据
ret3, _ := db.Exec(“delete from test where id = ?”, 3);
del_nums, _ := ret3.RowsAffected();
事务处理
tx, _ := db.Begin();
ret4, _ := tx.Exec(“update test set price = price + 100 where id = ?”, 1);
ret5, _ := tx.Exec(“update test set price = price – 100 where id = ?”, 2);
upd_nums1, _ := ret4.RowsAffected();
upd_nums2, _ := ret5.RowsAffected();
if upd_nums1 > 0 && upd_nums2 > 0 {
//只有两条更新同时成功,那么才提交
tx. Commit ();
} else {
//否则回滚
tx.Rollback();
}