【笔记】Beego通过ORM操作MySQL数据库

前言

Beego通过ORM操作MySQL数据库

下载依赖

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

引入依赖

1
import _ "github.com/go-sql-driver/mysql"

修改配置文件

conf/app.conf
1
2
driverName = mysql
dataSource = username:password@tcp(127.0.0.1:3306)/database_name?charset=utf8

读取配置文件

1
2
driverName, err = beego.AppConfig.String("driverName")
dataSource, err = beego.AppConfig.String("dataSource")

设置数据库

1
err := orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8")

orm.MaxIdleConnections(1):最大空闲连接
orm.MaxOpenConnections(1):最大数据库连接

1
err := orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxIdleConnections(1), orm.MaxOpenConnections(1))

注册数据库

数据库类型

orm.DRMySQL
orm.DRSqlite
orm.DROracle
orm.DRPostgres
orm.DRTiDB

1
err := orm.RegisterDriver("mysql", orm.DRMySQL)

指定时区

1
orm.DefaultTimeLoc = time.UTC

创建实体

  • 默认会将大驼峰命名的结构体名转换为下划线命名的数据表名,每逢遇到大写字母,就自动将大写字母替换为下划线+小写字母
  • 可以通过重写TableName()方法来指定数据表名

column():指定列名
-:忽略映射
index:定义索引
unique:定义唯一索引
auto:自增的主键
pk:不自增的主键
auto_now_add:自动添加当前时间,首次
auto_now:自动添加当前时间,每一次
type(date)type(datetime):定义MySQL中的类型
null:允许为空
size():定义MySQL中的varchar的长度
digits(4);decimals(2):保留4位有效数字,小数点后保留2位
description(文本内容):定义MySQL中的comment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package models

type User struct {
Key1 string `orm:"column(key1)"`
Key2 string `orm:"-"`
Key3 string `orm:"index"`
Key4 string `orm:"unique"`
Key5 int `orm:"auto"`
Key6 int `orm:"pk"`
Key7 time.Time `orm:"auto_now_add;type(datetime)"`
Key8 time.Time `orm:"auto_now;type(datetime)"`
Key9 string `orm:"null"`
Key10 string `orm:"size(1)"`
Key11 float64 `orm:"digits(4);decimals(2)"`
Key12 string `orm:"description(文本内容)"`
}

func (u *User) TableName() string {
return "user"
}

注册实体

1
orm.RegisterModel(new(User))

同步数据表结构

  • 没有就创建数据表,有就跳过
1
err := orm.RunSyncdb("default", false, true)

新增

  • 自动根据主键新增

count:成功执行次数

1
count, err := orm.NewOrm().Insert(&User{Id: 1, Key: "value"})

删除

根据条件删除

1
count, err := orm.NewOrm().Delete(&User{Id: 1})
1
count, err := orm.NewOrm().QueryTable(new(User)).Filter("id", 1).Delete(&User{})

修改

根据主键覆盖所有字段

  • 自动根据主键覆盖所有字段,零值字段也被覆盖
1
count, err := orm.NewOrm().Update(&User{Id: 1, Key: ""})

根据主键更新指定字段

  • 自动根据主键更新指定字段,零值字段也被更新
1
count, err := orm.NewOrm().Update(&User{Id: 1, Key: "value"}, "key")

根据条件更新指定字段

  • 根据条件更新指定字段,零值字段也被更新
1
2
3
count, err := orm.NewOrm().QueryTable(new(User)).Filter("id", 1).Update(orm.Params{
"key": "value",
})

查询

查询所有数据

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).All(&userList)

查询单个数据

  • 查询第一条符合条件的数据
1
2
3
var user User

err := orm.NewOrm().QueryTable(new(User)).One(&user)

条件查询

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id", 1).All(&userList)

比较运算符

__eq:等于
__ne:不等于
__lt:小于
__lte:小于等于
__gt:大于
__gte:大于等于

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__eq", 1).All(&userList)

IN

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__in", []int64{1, 2}).All(&userList)
1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__nin", []int64{1, 2}).All(&userList)

LIKE

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__contains", []int64{1, 2}).All(&userList)
1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__icontains", []int64{1, 2}).All(&userList)

AND

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__gte", 0).Filter("id__lte", 2).All(&userList)

OR

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__lte", 0).Or("id__gte", 2).All(&userList)

NULL

1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__isnull", true).All(&userList)
1
2
3
var userList []User

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id__isnull", false).All(&userList)

Limit子句和Offset子句

分页查询

pageSize:每页的数据量
pageNum:当前页的页码

1
2
3
4
5
var userList []User
var pageSize = 1
var pageNumber = 1

count, err := orm.NewOrm().QueryTable(new(User)).Limit(pageSize).Offset((pageNumber-1)*pageSize).All(&userList)

查询总数

1
2
3
var count int64

count, err := orm.NewOrm().QueryTable(new(User)).Filter("id", 1).Count()

查询是否存在

1
2
3
var exist bool

exist = orm.NewOrm().QueryTable(new(User)).Exist()

执行原生SQL语句

执行没有返回值的SQL语句

1
res, err := orm.NewOrm().Raw("DELETE FROM user WHERE id = ?", 1).Exec()

执行有返回值的SQL语句

1
2
3
var res string

res = orm.NewOrm().Raw("SELECT key FROM user WHERE id IN (?, ?)", []{1, 2})
1
2
3
var res string

orm.NewOrm().Raw("SELECT key FROM user WHERE id = ?", 1).QueryRow(&res)
1
2
3
var resList []string

orm.NewOrm().Raw("SELECT key FROM user WHERE id IN (?, ?)", []{1, 2}).QueryRows(&resList)

完成

参考文献

beegodoc
哔哩哔哩——千锋Go语言学习营