开发学院

您的位置:首页>教程>正文

教程正文

Golang 操作mysql的实例

Go 语言访问mysql

  本章中,我们将学习如何使用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目录下,如图所示:

go-mysql.png

  然后代码中直接导入即可,代码如下:

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)
    }
}