本章中,我们将学习如何使用Golang访问mysql数据库,Golang默认提供了database/sql包用于对SQL数据库的访问,。
database/sql可以根据driver打开关闭数据库连接,管理连接池。正在使用的连接被标记为繁忙,用完后回到连接池等待下次使用。所以,如果你没有把连接释放回连接池,会导致过多连接使系统资源耗尽。
引入mysql包
这里如果按照网上写的方式,导入 "github.com/go-sql-driver/mysql",会报错,所以笔者采用了简单的方式,直接从https://github.com/go-sql-driver/mysql下载zip包,解压后放到go语言安装目录的src目录下,起名为mysql,笔者的go安装目录为c:\go,zip包下面的一堆文件就放到C:\Go\src\mysql目录下,如图所示:
然后代码中直接导入即可,代码如下:
import ( "database/sql" "fmt" _ "mysql" )
连接mysql
导入mysql包之后就可以进行连接,如果没有问题,就可以返回db对象,后面就可以使用这个db对象。
db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8")//用户:密码@主机/数据库
新增/更新数据
拿到db对象后,就可以尝试使用它进行数据的插入和更新了。
stmt, err := db.Prepare("Insert ser_sign set name=?,phone=?,created_at=?") res, err := stmt.Exec("serfan", "13800000001", "2018-03-06")
执行上述代码,ser_sign表中就会增加一条新数据。
查询数据
上面例子已经插入了至少一条数据,这个时候我们可以进行查询的演示了。、
rows, err := db.Query("SELECT id,name FROM ser_sign") for rows.Next() { var id int var name string err = rows.Scan(&id, &name) fmt.Println(id,name); }
使用完rows对象,一定要记得释放资源:
rows.Close()
删除记录
删除记录跟新增调用的方法一样,只是sql语句有区别。
stmt, err := db.Prepare("delete from ser_sign where id=?") res, err := stmt.Exec(1)
执行完毕就完成了数据的删除
事务处理
下面是执行事务的演示代码:
tx, err:= db.Begin(); ret4, err:= tx.Exec("update ser_sign set name = 'hahaha' where id = ?", 1); ret5, err:= tx.Exec("update ser_sign set name = 'hehehe' where id = ?", 2); finish1, err:= ret4.RowsAffected(); finish2, err:= ret5.RowsAffected(); if finish1 > 0 && finish2 > 0 { tx.Commit(); } else { tx.Rollback(); }
最后是完整的测试代码,在笔者的环境中可以测试通过。
package main import ( "database/sql" "fmt" _ "mysql" ) func main(){ db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/db_jrj?charset=utf8")//用户:密码@主机/数据库 checkErr(err) //新增 stmt, err := db.Prepare("Insert ser_sign set name=?,phone=?,created_at=?") checkErr(err) res, err := stmt.Exec("serfan", "13800000001", "2018-03-06") checkErr(err) id, err := res.LastInsertId() checkErr(err) fmt.Println(id) //查询 rows, err := db.Query("SELECT id,name FROM ser_sign") for rows.Next() { var id int var name string err = rows.Scan(&id, &name) fmt.Println(id,name); } //删除 stmt, err = db.Prepare("delete from ser_sign where id=?") res, err = stmt.Exec(8) //事务 tx, err:= db.Begin(); ret4, err:= tx.Exec("update ser_sign set name = 'hahaha' where id = ?", 1); ret5, err:= tx.Exec("update ser_sign set name = 'hehehe' where id = ?", 2); finish1, err:= ret4.RowsAffected(); finish2, err:= ret5.RowsAffected(); if finish1 > 0 && finish2 > 0 { tx.Commit(); } else { tx.Rollback(); } fmt.Println("it is ok!") } func checkErr(err error) { if err != nil { panic(err) } }