go beego框架 之 orm
一 orm概述
官网文档:https://beego.me/docs/mvc/model/orm.md
orm特性:
- 支持 Go 的所有类型存储
- 轻松上手,采用简单的 CRUD 风格
- 自动 Join 关联表
- 跨数据库兼容查询
- 允许直接使用 SQL 查询/映射
- 严格完整的测试保证 ORM 的稳定与健壮
二 已支持的数据库驱动
MySQL:https://github.com/go-sql-driver/mysql
PostgreSQL:https://github.com/lib/pq
Sqlite3:https://github.com/mattn/go-sqlite
三 安装
go get github.com/astaxie/beego/orm
四 知识点详解
1 常用数据库设置函数
RegisterDriver
- 作用:注册数据库驱动
- 函数
// 参数1 driverName
// 参数2 数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置
func RegisterDriver(driverName string, typ DriverType) error
- 数据库类型
// For version 1.6
orm.DRMySQL
orm.DRSqlite
orm.DRPostgres
// < 1.6
orm.DR_MySQL
orm.DR_Sqlite
orm.DR_Postgres
- 举例
orm.RegisterDriver("mysql", orm.DRMySQL)
RegisterDataBase
- 作用:注册连接数据库
- 函数:
// 参数1 数据库的别名,用来在 ORM 中切换数据库使用
// 参数2 driverName
// 参数3 对应的链接字符串
// 参数4(可选) 设置最大空闲连接
// 参数5(可选) 设置最大数据库连接 (go >= 1.2)
func RegisterDataBase(aliasName, driverName, dataSource string, params ...int) error
- 举例
/*
数据库用户名:root,
数据库密码:123456
ip:127.0.0.1
端口号:3306
数据库名:hio
字符编码:charset=utf8
*/
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")
2 模型函数
RegisterModel
备注:
结构体 和 数据库表的映射关系:
例如:
AuthUser ->auth_user
Auth_User->auth__user
DB_AuthUser->d_b__auth_user
总结: 结构体名字中 第一个字母小写, 后面遇到大写字母小写,并在前面加下划线 组成的名字,为数据库中的表名
- 作用:注册模型
- 函数
func RegisterModel(models ...interface{})
// 备注:可以注册多个模型
- 举例
type UserInfo struct {
Id int
Username string
Password string
}
func init() {
orm.RegisterModel(new(UserInfo))
}
3 orm 接口使用
接口函数如下:
type Ormer interface {
Read(interface{}, …string) error
ReadOrCreate(interface{}, string, …string) (bool, int64, error)
Insert(interface{}) (int64, error)
InsertMulti(int, interface{}) (int64, error)
Update(interface{}, …string) (int64, error)
Delete(interface{}) (int64, error)
LoadRelated(interface{}, string, …interface{}) (int64, error)
QueryM2M(interface{}, string) QueryM2Mer
QueryTable(interface{}) QuerySeter
Using(string) error
Begin() error
Commit() error
Rollback() error
Raw(string, …interface{}) RawSeter
Driver() Driver
}
下面例子公用代码如下:
备注: 文档末尾会将整体代码附加
package main
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type UserInfo struct {
Id int
Username string
Password string
}
func init() {
orm.Debug = true
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")
orm.RegisterModel(new(UserInfo))
}
(1) insert
举例
user := UserInfo{Username: "wangwu", Password: "123456"}
id, err := o.Insert(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("id = ", id)
(2) update
user := UserInfo{Username: "xuliu", Password: "123456"}
user.Id = 2
num, err := o.Update(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
(3) delete
user := UserInfo{Id: 2}
num, err := o.Delete(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
(4) 读: read
user := UserInfo{Id: 1}
err := o.Read(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", user)
(5) 读: raw
- maps形式接收
备注: 每一个map中存放了一组数据
var maps []orm.Params
num, err :=o.Raw("select * from user_info").Values(&maps)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
for _,v := range maps {
fmt.Println("user info &v", v)
}
- 对象数组形式接收
var users []UserInfo
num, err :=o.Raw("select * from user_info").QueryRows(&users)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ",num)
fmt.Println("users = ", users)
(6) 读:NewQueryBuilder方式组装sql
var users []UserInfo
// 构造sql语句
qb,_ := orm.NewQueryBuilder("mysql")
qb.Select("*").From("user_info").Where("username = 'lisi'").Limit(1)
sql := qb.String()
num, err := o.Raw(sql).QueryRows(&users)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ",num)
fmt.Println("users = ", users)
*/
五 代码
/*
创建数据库代码:
create table user_info(id int auto_increment, username varchar(32), password varchar(128), paimary key(id))
*/
package main
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type UserInfo struct {
Id int
Username string
Password string
}
func init() {
orm.Debug = true
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/hio?charset=utf8")
orm.RegisterModel(new(UserInfo))
}
func main() {
o := orm.NewOrm()
o.Using("default") // 默认使用 default,你可以指定为其他数据库
// 插入数据
/*
user := UserInfo{Username: "wangwu", Password: "123456"}
id, err := o.Insert(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("id = ", id)
*/
// 更新数据
/*
user := UserInfo{Username: "xuliu", Password: "123456"}
user.Id = 2
num, err := o.Update(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
*/
// 读数据
/*
user := UserInfo{Id: 1}
err := o.Read(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", user)
*/
// 删除数据
/*
user := UserInfo{Id: 2}
num, err := o.Delete(&user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
*/
// 原生读取
/*
var maps []orm.Params
num, err :=o.Raw("select * from user_info").Values(&maps)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ", num)
for _,v := range maps {
fmt.Println("user info &v", v)
}
*/
/*
var users []UserInfo
num, err :=o.Raw("select * from user_info").QueryRows(&users)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ",num)
fmt.Println("users = ", users)
*/
// 采用queryBuilder 方式去读
/*
var users []UserInfo
// 构造sql语句
qb,_ := orm.NewQueryBuilder("mysql")
qb.Select("*").From("user_info").Where("username = 'lisi'").Limit(1)
sql := qb.String()
num, err := o.Raw(sql).QueryRows(&users)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("num = ",num)
fmt.Println("users = ", users)
*/
}