mysqldb库是一个基于database/sql接口的go语言MySQL ORM,且支持数据库连接池
go get github.com/go-sql-driver/mysql
go get github.com/kirinlabs/mysqldb
创建一个Adapter类型的ORM对象
var db *mysqldb.Adapter
var dberr error
func init(){
// db返回一个Adapter类型的ORM对象
db, dberr = mysqldb.New(
&mysqldb.Options{
User: "root",
Password: "root",
Host: "127.0.0.1",
Port: 3306,
Database: "dbname",
Charset: "utf8",
MaxIdleConns: 5,
MaxOpenConns: 5,
Debug: true,
}
)
if dberr != nil {
log.Panic("Connect mysql server error: ", dberr)
}
// 设置连接池,也可以不设置,直接在&mysqldb.Options里面声明即可
db.SetMaxIdleConns(50)
db.SetMaxOpenConns(100)
}
打开Debug调试模式,并设置日志级别
db.Debug(true) 可以在&mysqldb.Options里面声明即可
db.SetLogLevel(Mysqldb.LOG_DEBUG)
先声明一个对应一张article表的结构体对象
type Article struct {
Id int `json:"id"`
Title string `json:"title"`
Description string `json:""`
CreateDate time.Time `json:"create_date"`
}
获取一条记录,并返回Article对象
var article1 Article
err := db.Table("article").First(&article1)
var article2 Article
err := db.Table("article").Where("id",">",1).First(&article2)
var article3 Article
err := db.Table("article").Where("id",">",1).Where("create_date","2019-01-01 12:00:01").First(&article2)
获取Article对象的slice列表
var articles1 []*Article
err := db.Table("article").Where("id",">=","1").Limit(10).Find(&articles1)
var articles2 []*Article
err := db.Table("article").Where("id",">=","1").Limit(10,20).Find(&articles2)
以Map格式,获取记录
list,err := db.Table("article").Where("id",">=",1).Where("age",19).Fetch() //return map[string]interface{}
list,err := db.Table("article").Where("id",">=",1).Where("age",19).FetchAll() //return []map[string]interface{}
list,err := db.Table("article").Where("id", ">=", 1).Limit(10).Fields("id", "title").FetchAll()
以Map格式,插入新的记录
data := map[string]interface{}{
"title": "test Mysqldb one",
"cid": 1,
"Description": "test insert api",
"create_date": time.Now().Format("2006-01-02 15:04:05"),
}
num, err := db.Table("article").Insert(data)
以Article对象格式,插入新记录
article := Article{}
article.Title = "test insert two"
article.CreateDate = time.Now().Format("2006-01-02 15:04:05")
num, err := db.Table("article").Insert(&article)
以Map格式,更新记录
data := map[string]interface{}{
"id": 100, // 可以通过SetPk(" id "),来防止主键被更新
"title": "test Mysqldb one",
"cid": 1,
"Description": "update",
"create_date": time.Now().Format("2006-01-02 15:04:05"),
}
//SetPk("id")可以在更新操作时过滤掉主键Id
num, err := db.Table("article").Where("id", 1).SetPk("id").Update(data)
删除操作
num, err := db.Table("article").Where("id", 1).Delete()
num, err := db.Table("article").Delete()
注:作者为了防止误删除,特意限制了“空条件”的删除操作
默认主表别名设置为“A”,待连接的表另外设置为“B”
data, err := db.Table("article").LeftJoin("category", "A.cid=B.id").FetchAll()
data, err := db.Table("article").LeftJoin("category", "A.cid=B.id").WhereRaw("B.id is not null").FetchAll()
Right join operation
data, err := db.Table("article").RightJoin("category", "A.cid=B.id").FetchAll()
这部分的操作,更像参考了Laravel ORM的连接操作方式,也很的实现了快捷调用
Id
list, err := db.Table("article").Id(1).FetchAll() //默认会所参数传给表的Id字段
// 而且支持批量的in操作
list, err := db.Table("article").Id([]int{1,2,3}).FetchAll()
WhereIn
list, err := db.Table("article").WhereIn("id", []int{1, 2, 3}).FetchAll()
WhereNotIn
list, err := db.Table("article").WhereNotIn("id", []int{1, 2, 3}).FetchAll()
WhereRaw
list, err := db.Table("article").Where("id", 2).WhereRaw("cid>=1 and description=''").FetchAll()
OrWhere
list, err := db.Table("article").Where("id", 2).OrWhere("cid>=1 and description=''").FetchAll()
Limit
list, err := db.Table("article").Limit(10).FetchAll()
list, err := db.Table("article").Limit(10,20).FetchAll()
GroupBy
list, err := db.Table("article").Where("id", ">", 1).GroupBy("cid").FetchAll()
list, err := db.Table("article").Where("id", ">", 1).GroupBy("cid,title").FetchAll()
OrderBy
list, err := db.Table("article").Where("id", ">", 1).OrderBy("id").FetchAll()
list, err := db.Table("article").Where("id", ">", 1).OrderBy("id desc").FetchAll()
Distinct
list, err := db.Table("article").Distinct("cid").FetchAll()
Count
list, err := db.Table("article").Count()
list, err := db.Table("article").Where("id",">=",100).Count()
list, err := db.Table("article").Distinct("cid").Count()
Query一般执行查询相关语句
list, err := db.Query("select * from article")
Exec一般执行更新相关语句
num, err := db.Exec("update article set description='execute' where id=2")
要使用事务,不能使用先前生成的全局ORM对象,只能用ORM对象重新生成一个新的Model对象,其实该ORM的每次操作也是基于Model对象的
model := db.NewModel()
defer model.Close()
model.Begin()
_, err := model.Exec("update article set description='query' where id=3")
if err != nil {
model.Rollback()
return
}
_, err = model.Table("category").Where("id", 9).Delete()
if err != nil {
model.Rollback()
return
}
model.Commit()