go操作数据库上网查了下基本都是用gorm,gorm对于新手感觉不是很好上手,还是直接操作SQL语句更容易一些。
这篇文章是使用“go-sql-driver/mysql”操作Mysql数据库的。
Go Mysql驱动是完全实现了database/sql/driver定义的接口,只导入这个包即可。
链接数据库
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root:linan432@tcp(127.0.0.1)/links")
defer db.Close()
if err != nil{
panic(err)
}
if err:= db.Ping(); err != nil{
panic(err)
}
}
使用sql.Open方法创建一个Mysql链接,该方法并不会立刻链接Mysql,它会在第一个查询时才会去了解数据库,所以Open方法没有返回错误并不代表数据库可用。
如果需要验证数据库是否可以用,需要调用Ping、PingContext方法。
第一个参数传入驱动的名称,“mysql”
第二个参数传入数据库的相关信息:"用户名:密码:协议名(数据库地址)/数据库名"
执行SQL语句
Exec(),更新、插入、删除
result, err := db.Exec("INSERT INTO test VALUES(NULL,'test',0)")
if err != nil{
panic(err)
}
lastId, err := result.LastInsertId()
if err != nil{
panic(err)
}
fmt.Printf("LastId is %d",lastId)
Exec方返回两个值,result、error。该方法适用于更新、删除、插入的SQL语言。
result有两个方法:
- LastInsertId() (int64, error):返回插入的主键Id的值
- RowsAffected() (int64, error):返回插入、删除、更新所影响的行数
Query() 查询
Query方法返回两个值,Rows、error。
Rows是存储查询结果的类型。调用Rows的next方法获取所有数据。Scan方法获取行里字段的值。
rows, err := db.Query("SELECT tid,tname FROM tags")
if err != nil{
panic(err)
}
defer rows.Close()
//
for rows.Next(){
var tname string
var tid int
//把该行的tname字段值存入tname变量
err := rows.Scan(&tid,&tname)
if err != nil{
panic(err)
}
fmt.Println(tid,tname)
}
使用事物
tx, err := db.Begin()
if err != nil{
panic(err)
}
result, err := tx.Exec("UPDATE tags set tname='tx' WHERE tid=?", 20)
if err != nil{
panic(err)
}
if rows,err := result.RowsAffected(); err != nil{
fmt.Println("success")
tx.Commit()
}else{
fmt.Println(rows,err)
tx.Rollback()
}