beego ORM框架

概念

beego是一个快速开发Go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用。beego是基于八大独立模块构建的,cache、logs、conflg、orm、context、session、httplibs、toolbox。
beego ORM 是一个强大的 Go 语言 ORM 框架,目前该框架仍处于开发阶段,已支持数据库有:

  • MySQL
  • PostgreSQL
  • Sqlite3
什么是ORM?

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的 SQL 语句打交道,只要像平时操作对象一样操作它就可以了 。

连接数据库
  • 示例
package main
//导入依赖包
import ("fmt"// 使用 go get github.com/astaxie/beego/orm 获取包"github.com/astaxie/beego/orm"//mysql数据库驱动// 使用 go get github.com/go-sql-driver/mysql 获取//下划线_ "github.com/go-sql-driver/mysql"
)//Model Struct,就是数据库中表的结构
//Model定义
type User struct {Id   int `orm :"auto,pk"` //默认Name string `orm:"size(100)"`
}
//初始化操作
//1.完成模型、数据库、驱动的注册
//2.创建表
func init() {// 注册数据库//第三个参数:对应的链接字符串orm.RegisterDataBase("default", "mysql", "username:password@tcp(127.0.0.1:3306)/db_name?charset=utf8")// 注册Modelorm.RegisterModel(new(User))// 注册驱动// 参数1   driverName// 参数2   数据库类型,这个用来设置 driverName 对应的数据库类型// mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置orm.RegisterDriver("mysql" , orm.DRMySQL)// 创建表格,只会创建一次,重复会跳过//第一个参数,表的别名,默认为“default”//第二个参数,如果当前建表出错,跳过执行下一个//第三个参数,如果表存在给提醒,改为false不会提醒//如果没有这个函数,会报错,提示主键不存在orm.RunSyncdb("default", false, true)
}
  • 简单总结,ORM连接数据库:

1.导入依赖包和数据库驱动
2.建模型,设置参数
3.初始化操作:注册模型、数据库、驱动
4.创建表

CRUD操作

如果已知主键的值,那么可以使用这些方法进行 CRUD 操作:
四个方法 Read / Insert / Update / Delete

  • Read
var o ormer
o = orm.newOrm()
user := User{Id: 1}
err = o.Read(&user)
if err == orm.ErrNoRows {fmt.Println("查询不到")
} else if err == orm.ErrMissPK {fmt.Println("找不到主键")
} else {fmt.Println(user.Id, user.Name)
}
//Read 默认通过主键查询,可以使用指定的字段进行查询:
user := User{Name: "slene"}
err = o.Read(&user, "Name")
  • Insert
user.Name = "slene"
//第一个返回值为自增健 Id 的值
id, err := o.Insert(&user)
if err == nil {fmt.Println(id)
}
//创建后会自动对 auto 的 field 赋值
  • Update
//第一个返回值为影响的行数
//默认更新所有字段,可以指定更新字段o.Update(&user,“field1”,“field2”)
user := User{Id: 1}
if o.Read(&user) == nil {user.Name = "MyName"if num, err := o.Update(&user); err == nil {fmt.Println(num)}
}
  • Delete
if num, err := o.Delete(&User{Id: 1}); err == nil {fmt.Println(num)
}
高级查询

ORM 以 QuerySeter 来组织查询,每个返回 QuerySeter 的方法都会获得一个新的 QuerySeter 对象。

  • 基本使用方法
o := orm.NewOrm()
// 获取 QuerySeter 对象,user 为表名
qs := o.QueryTable("user")// 也可以直接使用对象作为表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
  • expr

用于描述字段和 sql 操作符,使用简单的 expr 查询方法。
比如:
User 表拥有 Profile表的外键,那么对 User 表查询对应的 Profile.Age 为条件,则使用 Profile__Age 注意,字段的分隔符号使用双下划线 __
expr 的尾部可以增加操作符以执行对应的 sql 操作。
比如:
Profile__Age__gt 代表 Profile.Age > 18 的条件查询。

// 使用字段名和Field名都是允许的
qs.Filter("Profile__Age", 18)
qs.Filter("profile__age__gt", 18)
// WHERE profile.age > 18
  • Operators
exact / iexact 等于
contains / icontains 包含
[gt / gte](#gt / gte) 大于 / 大于等于
[lt / lte](#lt / lte) 小于 / 小于等于
startswith / istartswith 以...起始
endswith / iendswith 以...结束
in
qs.Filter("profile__age__in", 17, 18, 19, 20)
// WHERE profile.age IN (17, 18, 19, 20)
isnull
qs.Filter("profile_id__isnull", true)
// WHERE profile_id IS NULL
高级查询接口

QuerySeter 是高级查询使用的接口:

type QuerySeter interface {//用来过滤查询结果,起到 包含条件 的作用
Filter(string, ...interface{}) QuerySeter
//用来过滤查询结果,起到 排除条件 的作用
Exclude(string, ...interface{}) QuerySeter
//自定义条件表达式
SetCond(*Condition) QuerySeter
//限制最大返回数据行数
Limit(int, ...int64) QuerySeter
Offset(int64) QuerySeter
GroupBy(...string) QuerySeter
OrderBy(...string) QuerySeter
//对应 sql 的 distinct 语句, 返回不重复的值.
Distinct() QuerySeter
//关系查询
RelatedSel(...interface{}) QuerySeter
//依据当前的查询条件,返回结果行数
Count() (int64, error)
//依据当前的查询条件,结果是否存在
Exist() bool
//依据当前查询条件,进行批量更新操作
Update(Params) (int64, error)
//依据当前查询条件,进行批量删除操作
Delete() (int64, error)
//用于一次 prepare 多次 insert 插入,以提高批量插入的速度
PrepareInsert() (Inserter, error)
//返回对应的结果集对象
All(interface{}, ...string) (int64, error)
//尝试返回单条记录
One(interface{}, ...string) error
//返回结果集的 key => value 值,key 为 Model 里的 Field name,value 的值 以 string 保存
Values(*[]Params, ...string) (int64, error)
//返回的结果集以slice存储,结果的排列与 Model 中定义的 Field 顺序一致,返回的每个元素值以 string 保存
ValuesList(*[]ParamsList, ...string) (int64, error)
//只返回特定的 Field 值,将结果集展开到单个 slice 里
ValuesFlat(*ParamsList, string) (int64, error)
}

模型定义

数据库数据转换和自动建表默认的表名规则:

AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user

除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留。

  • 设置参数
    示例:
orm:"null;rel(fk)"

多个设置间使用 “ ; ” 分隔,设置的值如果是多个,使用 “ ,” 分隔。

  • 忽略字段
    设置 - 即可忽略 struct 中的字段
type User struct {...Field string `orm:"-"`
...
}
  • auto
    当 Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增键
  • pk
    设置为主键,适用于自定义其他类型为主键
type User struct {Id   int `orm :"auto,pk"` //默认
}

当模型定义里没有主键时,符合上述类型且名称为 Id 的 Field 将被视为自增键。

  • null
    数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL
  • unique
    为单个字段增加 unique 键
Name string `orm:"unique"`
  • column
    为字段设置 db 字段的名称
Name string `orm:"column(user_name)"`
  • size
    string 类型字段默认为 varchar(255), 设置 size 以后,db type 将使用 varchar(size)
Title string `orm:"size(60)"`
  • digits / decimals
//设置 float32, float64 类型的浮点精度
Money float64 `orm:"digits(12);decimals(4)"`
//总长度 12 小数点后 4 位 eg: 99999999.9999
  • auto_now / auto_now_add
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
//auto_now 每次 model 保存时都会对时间自动更新,修改时
//auto_now_add 第一次保存时才设置时间,创建时
//对于批量的 update 此设置是不生效的
  • type
    设置为 date 时,time.Time 字段的对应 db 类型使用 date
Created time.Time `orm:"auto_now_add;type(date)"`
//设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime
Created time.Time `orm:"auto_now_add;type(datetime)"`
  • default
    为字段设置默认值,类型必须符合
type User struct {...Status int `orm:"default(1)"`...
}

初识beego ORM框架相关推荐

  1. ORM框架之Spring Data JPA(一)Hibernate实现JPA规范

    一.ORM简述 ORM(Object-Relational Mapping) 表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到建立对象与数 ...

  2. SQL基础知识回顾--(Go/Python/Beego ORM/Django ORM/原生Sql)

    序言 Filecoin即将上线.我们知道filecoin是由goLang编写的,所以在此间歇期,我打算同时复习一下go和python的知识,本文的侧重点在于如何高效率的使用orm-sql语句. Go操 ...

  3. 基于.NET的微软ORM框架视频教程(Entity Framework技术)

    基于.NET的微软ORM框架视频教程(Entity Framework技术) 第一讲  ORM映射 第二讲 初识EntifyFramework框架 第三讲 LINQ表达式查询 第四讲 LINQ方法查询 ...

  4. PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db. 而且市面上的orm框架有很多,有重量级的Entity Framework,有 ...

  5. python数据库框架_Python数据库及ORM框架对比选择

    使用Python进行MySQL的库主要有三个: Python-MySQL(更熟悉的名字可能是MySQLdb), PyMySQL SQLAlchemy. Python-MySQL: 资格最老,核心由C语 ...

  6. orm框架有哪些_java技术哪些是必学的?

    我们接触过java需要的小伙伴们都知道java是一门强大而又复杂的编程语言,现如今在互联网行业,java的身影随处可见,可能刚学习的小伙伴们会被java语言庞大的体系图吓到,不过知识毕竟是一个积累的过 ...

  7. ORM 框架中SQLALCHEMY一点点个人总结

    声明:工作原因涉及一点 What is ORM 答: object relation mapping 一种实现对象与数据库中的关系表映射的中间件.ORM 框架中最有名的是SQLALCHEMY 具体使用 ...

  8. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架

    Sequelize 4.43.0 发布了,Sequelize 是一款基于 Nodejs 的异步 ORM 框架,它同时支持 PostgreSQL.MySQL.SQLite 和 MSSQL 多种数据库,很 ...

  9. 10分钟手撸极简版ORM框架!

    最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernte这种ORM框架,它们是如何实现的呢? 为了能够让小伙伴们 ...

最新文章

  1. 从命令行使用 wget 调试网页错误
  2. 学术 | 热议:寒门硕士要不要继续读博士?
  3. 舍友清华博士毕业,我建议他留在高校
  4. iOS自定义NavigationBar
  5. 【超详细】思科实验模拟器EVE的安装与使用,附下载链接
  6. 零基础学Python(第十四章 字典)
  7. 测试管理 | 4种优先级排序方法一定要掌握
  8. 剑指offer(C++)-JZ35:复杂链表的复制(数据结构-链表)
  9. 网游服务端开发入门知识
  10. spring cloud gateway 源码解析(4)跨域问题处理
  11. unity visual effect Graph 1
  12. 【点宽专栏】Dual Thrust 交易策略
  13. HttpGet请求数据乱码的原因
  14. B站4K视频下载方法
  15. 在微软工作有多舒服?
  16. 人民币转换美金的c语言代码大全,人民币和美元大写格式在线工具,美元美金数字金额转换大写,外币大写金额...
  17. 设计模式之十三观察者模式
  18. Linux-5.10源代码之网络系统简介:
  19. 飞机座舱布局工效综合评价与评价方法初探
  20. 霓虹灯(light)

热门文章

  1. 男人有必要学会做饭,做家务吗?
  2. 趣头条的下沉和上升法则 ||新芒X
  3. QT qmake 和cmake 添加exe图标
  4. 小米发布会上的沉默时刻
  5. string库的简介和使用
  6. PyCharm + Docker:打造最舒适的深度学习炼丹炉
  7. 选错实施顾问公司 ERP项目九死一生
  8. Mac 下IDEA 在同一窗口下打开多个项目
  9. 《Windows 核心编程》27章:硬件输入模型和局部输入状态
  10. jerasure纠删