Go使用mysqldb ORM操作mysql数据库

mysqldb库是一个基于database/sql接口的go语言MySQL ORM,且支持数据库连接池

安装Mysqldb

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

go get github.com/kirinlabs/mysqldb

如何使用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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值