前言
Beego通过ORM操作MySQL数据库
下载依赖
1
| go get github.com/go-sql-driver/mysql
|
引入依赖
1
| import _ "github.com/go-sql-driver/mysql"
|
修改配置文件
conf/app.conf1 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语言学习营