beego orm学习
1、数据库
(1)RegisterDriver()注册数据库类型
支持以下三种类型:
// For version 1.6
orm.DRMySQL
orm.DRSqlite
orm.DRPostgres// < 1.6
orm.DR_MySQL
orm.DR_Sqlite
orm.DR_Postgres// 参数1 driverName
// 参数2 数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置
orm.RegisterDriver("mysql", orm.DRMySQL)
(2)注册数据库
RegisterDataBase()
ORM 必须
注册一个别名
为 default
的数据库,作为默认使用。
ORM 使用 golang 自己的连接池
// 参数1 数据库的别名,用来在 ORM 中切换数据库使用
// 参数2 driverName
// 参数3 对应的链接字符串
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8")// 参数4(可选) 设置最大空闲连接
// 参数5(可选) 设置最大数据库连接 (go >= 1.2)
maxIdle := 30
maxConn := 30
orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", maxIdle, maxConn)
(3)RegisterModel()注册模型,目的是将数据库中的表结构与模型结构体相对应。
(4)RunSyncdb()自动创建表
func init() {// set default databaseorm.RegisterDataBase("default", "mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8", 30)// register modelorm.RegisterModel(new(User))// create tableorm.RunSyncdb("default", false, true)
}
(5)GetDB()获取数据库对象
从已注册的数据库返回 *sql.DB 对象
,默认返回别名为 default 的数据库。
(6)Using()切换为其他数据库
orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8")
orm.RegisterDataBase("db2", "sqlite3", "data.db")o1 := orm.NewOrm()
o1.Using("db1")o2 := orm.NewOrm()
o2.Using("db2")// 切换为其他数据库以后
// 这个 Ormer 对象的其下的 api 调用都将使用这个数据库
(7)Driver()返回当前 ORM 使用的 db 信息
type Driver interface {Name() stringType() DriverType
}orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8")
orm.RegisterDataBase("db2", "sqlite3", "data.db")o1 := orm.NewOrm()
o1.Using("db1")
dr := o1.Driver()
fmt.Println(dr.Name() == "db1") // true
fmt.Println(dr.Type() == orm.DRMySQL) // trueo2 := orm.NewOrm()
o2.Using("db2")
dr = o2.Driver()
fmt.Println(dr.Name() == "db2") // true
fmt.Println(dr.Type() == orm.DRSqlite) // true
(8)调试模式打印查询语句
简单的设置 Debug 为 true
打印查询的语句
可能存在性能问题,不建议使用在生产模式
func main() {orm.Debug = true
...
默认使用 os.Stderr 输出日志信息
改变输出到你自己的 io.Writer
var w io.Writer
...
// 设置为你的 io.Writer
...
orm.DebugLog = orm.NewLog(w)
2、表
(1)Read()查询表
o := orm.NewOrm()
user := User{Id: 1}
err := o.Read(&user)
Read 默认
通过查询主键赋值
,可以使用指定的字段
进行查询:
user := User{Name: "slene"}
err = o.Read(&user, "Name")
(2)ReadOrCreate()尝试从数据库读取,不存在的话就创建一个
默认必须传入一个参数
作为条件字段
,同时也支持多个参数
多个条件字段
o := orm.NewOrm()
user := User{Name: "slene"}
// 三个返回参数依次为:是否新创建的,对象 Id 值,错误
if created, id, err := o.ReadOrCreate(&user, "Name"); err == nil {if created {fmt.Println("New Insert an object. Id:", id)} else {fmt.Println("Get an object. Id:", id)}
}
(3)Insert()第一个返回值为自增健 Id 的值
o := orm.NewOrm()
var user User
user.Name = "slene"
user.IsActive = trueid, err := o.Insert(&user)
if err == nil {fmt.Println(id)
}
创建后会自动对 auto 的 field 赋值
(4)InsertMulti()
同时插入多个对象
类似sql语句
insert into table (name, age) values("slene", 28),("astaxie", 30),("unknown", 20)
第一个参数 bulk 为并列插入的数量,第二个为对象的slice
返回值为成功插入的数量
users := []User{{Name: "slene"},{Name: "astaxie"},{Name: "unknown"},...
}
successNums, err := o.InsertMulti(100, users)
bulk 为 1 时,将会顺序插入 slice 中的数据
(5)Update()第一个返回值为影响的行数
o := orm.NewOrm()
user := User{Id: 1}
if o.Read(&user) == nil {user.Name = "MyName"if num, err := o.Update(&user); err == nil {fmt.Println(num)}
}
Update 默认更新所有的字段
,可以更新指定的字段
:
// 只更新 Name
o.Update(&user, "Name")
// 指定多个字段
// o.Update(&user, "Field1", "Field2", ...)
...
(6)Delete()
第一个返回值为影响的行数
o := orm.NewOrm()
if num, err := o.Delete(&User{Id: 1}); err == nil {fmt.Println(num)
}
3、高级查询
(1)获取查询需要的QuerySeter 对象
o := orm.NewOrm()
// 获取 QuerySeter 对象,user 为表名(或表结构)
qs := o.QueryTable("user")
(2)Filter()用来过滤查询
结果,起到 包含条件
的作用
多个 Filter
之间使用 AND
连接
(3)Exclude()用来过滤查询
结果,起到 排除条件
的作用
使用 NOT
排除条件
多个 Exclude
之间使用 AND
连接
(4)SetCond()自定义条件表达式
cond := orm.NewCondition()
cond1 := cond.And("profile__isnull", false).AndNot("status__in", 1).Or("profile__age__gt", 2000)qs := orm.QueryTable("user")
qs = qs.SetCond(cond1)
// WHERE ... AND ... AND NOT ... OR ...cond2 := cond.AndCond(cond1).OrCond(cond.And("name", "slene"))
qs = qs.SetCond(cond2).Count()
// WHERE (... AND ... AND NOT ... OR ...) OR ( ... )
(5)Limit()限制最大返回数据行数,第二个参数可以设置 Offset
var DefaultRowsLimit = 1000 // ORM 默认的 limit 值为 1000// 默认情况下 select 查询的最大行数为 1000
// LIMIT 1000qs.Limit(10)
// LIMIT 10qs.Limit(10, 20)
// LIMIT 10 OFFSET 20 注意跟 SQL 反过来的qs.Limit(-1)
// no limitqs.Limit(-1, 100)
// LIMIT 18446744073709551615 OFFSET 100
// 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况
(6)Offset()设置 偏移行数
qs.Offset(20)
// LIMIT 1000 OFFSET 20
(7)GroupBy()
qs.GroupBy("id", "age")
// GROUP BY id,age
(8)OrderBy()
参数使用 expr
在 expr 前
使用减号 -
表示 DESC
的排列
qs.OrderBy("id", "-profile__age")
// ORDER BY id ASC, profile.age DESC
qs.OrderBy("-profile__age", "profile")
// ORDER BY profile.age DESC, profile_id ASC
(9)Distinct()对应 sql 的 distinct
语句, 返回不重复的值.
qs.Distinct()
// SELECT DISTINCT
(10)Count()依据当前的查询条件,返回结果行数
cnt, err := o.QueryTable("user").Count() // SELECT COUNT(*) FROM USER
fmt.Printf("Count Num: %s, %s", cnt, err)
(11)Exist()判断查询条件存在
exist := o.QueryTable("user").Filter("UserName", "Name").Exist()
fmt.Printf("Is Exist: %s", exist)
(12)Update()依据当前查询条件
,进行批量更新
操作
num, err := o.QueryTable("user").Filter("name", "slene").Update(orm.Params{"name": "astaxie",
})
fmt.Printf("Affected Num: %s, %s", num, err)
// SET name = "astaixe" WHERE name = "slene"
原子操作增加字段值
// 假设 user struct 里有一个 nums int 字段
num, err := o.QueryTable("user").Update(orm.Params{"nums": orm.ColValue(orm.ColAdd, 100),
})
// SET nums = nums + 100
orm.ColValue
支持以下操作
ColAdd // 加
ColMinus // 减
ColMultiply // 乘
ColExcept // 除
(13)Delete()依据当前查询条件
,进行批量删除操作
num, err := o.QueryTable("user").Filter("name", "slene").Delete()
fmt.Printf("Affected Num: %s, %s", num, err)
// DELETE FROM user WHERE name = "slene"
(14)All()
返回对应的结果集对象
All 的参数支持 *[]Type 和 *[]*Type 两种形式的 slice
var users []*User
num, err := o.QueryTable("user").Filter("name", "slene").All(&users)
fmt.Printf("Returned Rows Num: %s, %s", num, err)
All / Values / ValuesList / ValuesFlat 受到 Limit 的限制,默认最大行数为 1000
(15)One()尝试返回单条记录
var user User
err := o.QueryTable("user").Filter("name", "slene").One(&user)
if err == orm.ErrMultiRows {// 多条的时候报错fmt.Printf("Returned Multi Rows Not One")
}
if err == orm.ErrNoRows {// 没有找到记录fmt.Printf("Not row found")
}
(16)Values()获取的查询的值,是多个键值对
返回结果集的 key => value 值
key 为Model里的Field name
, value的值是interface{}类型
,例如,如果你要将value赋值给struct中的某字段
,需要根据结构体对应字段类型使用断言
获取真实值
。举例:Name : m[“Name”].(string)
var maps []orm.Params
num, err := o.QueryTable("user").Values(&maps)
if err == nil {fmt.Printf("Result Nums: %d\n", num)for _, m := range maps {fmt.Println(m["Id"], m["Name"])}
}
eg、
if _, err := db.Raw(templateSql, extractorIds).Values(&templateMaps); err != nil {}
4、使用原生的sql
ids := []int{1, 2, 3}
p.Raw("SELECT name FROM user WHERE id IN (?, ?, ?)", ids)
创建一个 RawSeter
o := orm.NewOrm()
var r RawSeter
r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
(1)QueryRow()返回一条查询语句
type User struct {Id intUserName string
}var user User
err := o.Raw("SELECT id, user_name FROM user WHERE id = ?", 1).QueryRow(&user)
(2)QueryRows()返回多条查询语句
QueryRows 支持的对象还有 map 规则是和 QueryRow 一样的,但都是 slice
type User struct {Id intUserName string
}var users []User
num, err := o.Raw("SELECT id, user_name FROM user WHERE id = ?", 1).QueryRows(&users)
if err == nil {fmt.Println("user nums: ", num)
}
(3)Values / ValuesList / ValuesFlat返回结果集
Values()返回任何类型
返回结果集的 key => value
值
var maps []orm.Params
num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).Values(&maps)
if err == nil && num > 0 {fmt.Println(maps[0]["user_name"]) // slene
}
ValuesList()返回结果集 slice
var lists []orm.ParamsList
num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).ValuesList(&lists)
if err == nil && num > 0 {fmt.Println(lists[0][0]) // slene
}
ValuesFlat()返回单一字段的平铺 slice 数据
var list orm.ParamsList
num, err := o.Raw("SELECT id FROM user WHERE id < ?", 10).ValuesFlat(&list)
if err == nil && num > 0 {fmt.Println(list) // []{"1","2","3",...}
}
https://beego.me/docs/mvc/model/query.md
beego orm学习相关推荐
- Beego框架学习笔记01--初识Beego
1.导言 本来在go语言的基础语法学习结束的时候,打算学gee框架.但是偶然听朋友提到了beego,发现beego和前端的Vu e.js,python的dJungle还有flask都好像.这对于有ph ...
- table: github.com/astaxie/beego/orm.Ormer not found
报错: table: github.com/astaxie/beego/orm.Ormer not found, make sure it was registered with RegisterMo ...
- SQL基础知识回顾--(Go/Python/Beego ORM/Django ORM/原生Sql)
序言 Filecoin即将上线.我们知道filecoin是由goLang编写的,所以在此间歇期,我打算同时复习一下go和python的知识,本文的侧重点在于如何高效率的使用orm-sql语句. Go操 ...
- 初识beego ORM框架
beego ORM框架 概念 beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API.Web及后端服务等各种应用.beego是基于八大独立模块构建的,cache.logs.confl ...
- 转载--SqlAlchemy ORM 学习
转载原文地址:http://blog.csdn.net/yueguanghaidao/article/details/7485345,http://blog.csdn.net/yueguanghaid ...
- 【无标题】如何在C#中使用Dapper ORM学习通http://www.bdgxy.com/
文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...
- beego orm 时间相差八小时
使用beego的orm时,mysql数据库为datetime格式的字段插入之后,数据库看到的时间会比正常时间靠前8个小时 解决 连接数据库时加上loc=Local即可 root:root@/orm_t ...
- golang beego orm mysql sqlite3 postgresql 模型字段 数据库类型 对应关系
目录 MySQL Sqlite3 PostgreSQL 关系型字段 在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准. 默认所有的字段都是 NOT NULL MySQL go mys ...
- golang beego orm报错 must have one register DataBase alias named `default` 解决方案
func init(){//注册定义的modelorm.RegisterModel(new(Generalize))orm.RegisterDriver("mysql", orm. ...
最新文章
- 样条+样条函数+样条分析+spline+样条插值+样条回归
- python读取、写入、移动、复制文件(夹)以及其他关于文件(夹)的操作
- Go语言11岁了,网友:他喵的,终于确定出「泛型」了
- html掷骰子小游戏,网页实现掷骰子小游戏
- 优化Image设置Tiled类型产生过多的三角形顶点
- javaweb学习总结(四十二)——Filter(过滤器)学习
- 解决ImportError: cannot import name ‘imread‘ from ‘scipy.misc‘
- 天天Linux-编译和调试程序
- HttpHandler浅析
- html中select只读显示
- Android系统(127)---Android6.0存储中加入总内存和系统内存项和在西语下把,换成.
- 轻松解决idea一直卡在Resolving Maven dependencies的问题
- 别以为太简单!创建最好邮件营销内容的13个技巧
- Vue3.0项目——打造企业级音乐App(二)图片懒加载、v-loading指令的开发和优化
- 「构建企业级推荐系统系列」推荐系统的人工调控
- HTML无序列表四大名著
- wsl2 + ubuntu安装下载和一些安装推荐
- 零基础学C语言(C语言入门)
- php高仿网络硬盘,高仿永硕网盘E盘源码
- 贾扬清:我对人工智能方向的一点浅见 1
热门文章
- 【论文笔记】SimpleTrack: Understanding and Rethinking 3D Multi-object Tracking
- ad下发统一桌面出现黑屏
- 天猫国际总经理刘鹏:帮全球品牌连接1亿新中产
- 荣耀X10和vivoY73s哪个好
- 使用Data Lake Analytics从OSS清洗数据到AnalyticDB
- cherry-pick 解决gerrit 代码的merge conflict问题
- simulink中固定大小矩阵和可变大小矩阵创建的几个陷阱
- LiveQing视频点播RTMP推流直播服务支持H5无插件WebRTC超低延时视频直播
- Bootstrap框架菜鸟入门教程
- MySQL打开时在命令行输入密码后,按回车键闪退,快速解决方法