使用GO连接MYSQL数据库

GO没有内置的数据库驱动,但是GO定义了数据库驱动包接口database/sql/driver,用户可以基于驱动接口开发相应的数据库驱动。

这样做的好处是,以后迁移数据库时,只需要导入对应的数据库驱动包即可,无需修改代码。

这里先说一下以下两个Go包。

database/sql :Package sql provides a generic interface around SQL (or SQL-like) databases. The sql package must be used in conjunction with a database driver.(和程序员有关)

database/sql/driver:Package driver defines interfaces to be implemented by database drivers as used by package sql.(和数据库驱动开发者有关)


接下来的例子,我以Go MySQL Driver驱动包为例进行说明。


(1)首先下载Git工具,安装Go MySQL Driver驱动包需要

https://git-scm.com/downloads

(2)安装Go MySQL Driver驱动包

go get github.com/go-sql-driver/mysql

注意:上面的驱动包安装到了GOPATH路径下。


下面进行代码演示。

(1)在mysql数据库上创建测试表

CREATE TABLE userinfo (
  uid int(10) NOT NULL AUTO_INCREMENT,
  username varchar(64) NULL DEFAULT NULL,
  departname varchar(64) NULL DEFAULT NULL,
  created date NULL DEFAULT NULL,
  PRIMARY KEY (uid)
  )


(2)代码部分


package main
 
import (
    "database/sql"
    "fmt"
 
    _ "github.com/go-sql-driver/mysql"
)
 
func insertData(db *sql.DB) { //插入数据
    stmt, err := db.Prepare("insert into userinfo (username,departname,created) values (?,?,?)") //Prepare creates a prepared statement for later queries or executions.
    checkErr(err)
 
    res, err := stmt.Exec("wuyue", "测试部门", "2016-03-02") //Exec executes a prepared statement with the given arguments and returns a Result summarizing the effect of the statement.
    checkErr(err)
 
    id, err := res.LastInsertId() //LastInsertId returns the integer generated by the database in response to a command.
    checkErr(err)
 
    fmt.Println("Last insert id :", id)
}
 
func updateData(db *sql.DB) { //更新数据
    stmt, err := db.Prepare("update userinfo set departname=? where uid=?")
    checkErr(err)
 
    res, err := stmt.Exec("研发部门", 1)
    checkErr(err)
 
    affect, err := res.RowsAffected() //RowsAffected returns the number of rows affected by an
    // update, insert, or delete.
    checkErr(err)
 
    fmt.Println("受影响的行数 : ", affect)
}
 
func selectData(db *sql.DB) { //查询数据
    rows, err := db.Query("select * from userinfo")
    checkErr(err)
 
    for rows.Next() {
        var uid int
        var username string
        var departname string
        var created string
        err := rows.Scan(&uid, &username, &departname, &created)
        checkErr(err)
        fmt.Printf("uid : %d\n", uid)
        fmt.Printf("username : %s\n", username)
        fmt.Printf("departname : %s\n", departname)
        fmt.Printf("created : %s\n", created)
    }
}
 
func deleteData(db *sql.DB) { //删除数据
    stmt, err := db.Prepare("delete from userinfo where uid=?")
    checkErr(err)
 
    res, err := stmt.Exec(1)
    checkErr(err)
 
    affect, err := res.RowsAffected()
    checkErr(err)
 
    fmt.Println("删除的行数:", affect)
}
 
func main() {
    db, err := sql.Open("mysql", "root:123@/test?charset=utf8") //打开mysql数据库连接,并返回一个数据库句柄
    checkErr(err)
 
    insertData(db)
    updateData(db)
    selectData(db)
    deleteData(db)
 
    err = db.Close() //Close closes the database, releasing any open resources.
    checkErr(err)
}
 
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}
 

运行:

C:/go/bin/go.exe run testmysql.go [E:/project/go/proj/src]

Last insert id : 1

受影响的行数 : 1

uid : 1

username : wuyue

departname : 研发部门

created : 2016-03-02

删除的行数: 1

成功: 进程退出代码 0.





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉淀期待未来9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值