本章中,我们将学习如何使用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)
}
}