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.