最近要做个数据库课设,就打算用 Golang 来做个 RESTful 后端,就来学学怎么用 Golang 操作 MariaDB 。
我们需要让 Golang 能够与 MariaDB/MySQL 进行交互,因此要下载与其匹配的数据库驱动。这里我使用的是 Go-MySQL-Driver 。
安装 go-mysql-driver :
$ go get -u github.com/go-sql-driver/mysql
下载之后,我们需要在 Go 中引用相关数据库驱动包:
import (
_ "github.com/go-sql-driver/mysql"
"database/sql"
)
使用 sql.Open() 来连接数据库,并通过 .SetMaxIdleConns() 和 .SetMaxOpenConns() 指定最大连接数。
db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/pdbs_course")
if err != nil {
panic(err.Error())
}
defer db.Close()
db.SetMaxIdleConns(20)
db.SetMaxOpenConns(20)
if err := db.Ping(); err != nil{
log.Fatalln(err)
} else {
fmt.Println("Connection successful!")
}
由于是为了测试基本 CRUD 功能,因此我们使其一个测试用的数据库及测试表。
func checkTable(db *sql.DB) {
db.Exec("create database if not exists pdbs_course")
fmt.Println("Database checked!")
db.Exec("create table if not exists test_go_sql(id int primary key, number char(9), name char(10))")
fmt.Println("Table checked!")
}
我们来增加一条数据,执行的就是基本的 INSERT 语句:
func Create (db *sql.DB, id int, number string, name string) int {
statement, err := db.Prepare("insert into test_go_sql(id, number, name) values (?, ?, ?)")
if err != nil {
log.Fatal(err.Error())
}
res, err := statement.Exec(id, number, name)
if err != nil {
log.Fatal(err.Error())
}
cur_id, err := res.LastInsertId()
if err != nil {
log.Fatal(err.Error())
}
return int(cur_id)
}
使用 .Query() 和基本 SELECT 语句进行查找,这里要注意,使用 .Scan() 进行扫描的时候最好要使用 sql 库中的 Null 系列类型,否则提取时遇到 NULL 会报错。
忽略 Error 也是一种解决方案,但是得到的值就是默认值,无法分辨 NULL,不建议。
type record struct {
id int
number sql.NullString
name sql.NullString
}
func Retrive (db *sql.DB, id int) {
rows, err := db.Query("select * from test_go_sql where id = ? ", id)
if err != nil {
panic(err.Error())
}
defer rows.Close()
var rec record
for rows.Next() {
err = rows.Scan(&rec.id, &rec.number, &rec.name)
if err != nil {
log.Fatal(err)
}
fmt.Println(rec.id, rec.number.String, rec.name.String)
}
if err != nil {
log.Fatal(err)
}
}
更改一条数据,使用基本的 UPDATE 语句:
func Update (db *sql.DB, id int, number string, name string) int {
stmt, err := db.Prepare("update test_go_sql set number = ?, name = ? where id = ?")
if err != nil {
log.Fatal(err)
}
res, err := stmt.Exec(number, name, id)
if err != nil {
log.Fatal(err)
}
num, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
return int(num)
}
删除一条记录,使用 DELETE 语句:
func Delete (db *sql.DB, id int) int {
stmt, err := db.Prepare("delete from test_go_sql where id = ?")
if err != nil {
log.Fatal(err)
}
res, err := stmt.Exec(id)
if err != nil {
log.Fatal(err)
}
num, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
return int(num)
}
其实 go-mysql-driver 还是很简单易用的,常用的就以下几个 API :
方法 | 作用 |
---|---|
.Exec() | 在数据库中执行指定指令 |
.Prepare() | 准备要执行的指令 |
.Query() | 查询操作,可返回集合 |