beego orm 学习笔记
1、mysql. 需要驱动 : _ "github.com/go-sql-driver/mysql"
2、连接: 注册驱动和数据库:
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "bsstar:whj710718@tcp(127.0.0.1:3306)/shop?charset=utf8&loc=Local")
orm.SetMaxIdleConns("default", 30)
orm.SetMaxOpenConns("default", 30)
3、调试查询日志: orm.Debug = true 可以设置log输出
var w io.Writer
...
// 设置为你的 io.Writer
...
orm.DebugLog = orm.NewLog(w)
4、ORM
对象被设计为无状态的,因而天然是线程安全的。也因此,我们建议在使用过程中,一个数据库应该只存在一个ORM
对象。
5、RegisterModel 不是必须
6、使用default之外的数据库: or := orm.NewOrmUsingDB("syxsoft")
7、raw 原生sql
var r RawSeter
r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
r.Exec() 执行 res.RowsAffected() 影响多少记录
r.QueryRow(&user) 一条记录到结构
r.QueryRows(&user) 多条记录到结构
r.SetArgs("arg1", "arg2").Exec() 改变 Raw(sql, args…) 中的 args 参数,返回一个新的 RawSeter
p, err := o.Raw("UPDATE user SET name = ? WHERE name = ?").Prepare() 一次 prepare 多次 exec,以提高批量执行的速度。
Values
返回结果集的 key => value 值
num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).Values(&maps)
ValuesList
返回结果集 slice, 只有值
num, err := o.Raw("SELECT user_name FROM user WHERE status = ?", 1).ValuesList(&lists)
ValuesFlat
返回单一字段的平铺 slice 数据,类似 pluck
num, err := o.Raw("SELECT id FROM user WHERE id < ?", 10).ValuesFlat(&list)
RowsToMap
询结果匹配到 map 里
res := make(orm.Params)
nums, err := o.Raw("SELECT name, value FROM options_table").RowsToMap(&res, "name", "value")
RowsToStruct
查询结果匹配到 struct 里
res := new(Options)
nums, err := o.Raw("SELECT name, value FROM options_table").RowsToStruct(res, "name", "value")
构造查询
qb, _ := orm.NewQueryBuilder("mysql")
// 构建查询对象
qb.Select("user.name",
"profile.age").
From("user").
InnerJoin("profile").On("user.id_user = profile.fk_user").
Where("age > ?").
OrderBy("name").Desc().
Limit(10).Offset(0)
// 导出 SQL 语句
sql := qb.String()
// 执行 SQL 语句
o := orm.NewOrm()
o.Raw(sql, 20).QueryRows(&users)
处理事务
手动处理事务
// 创建orm对象o := orm.NewOrm() // 开始事务 tx, err := o.Begin() // 开始执行各种sql语句,更新数据库,这里可以使用beego orm支持任何一种方式操作数据库 // 例如,更新订单状态 _, err1 := tx.QueryTable("orders").Filter("Id", 1001).Update(orm.Params{"Status": "SUCCESS",}) // 给用户加积分 _, err2 := tx.Raw("update users set points = points + ? where username=?", "tizi365", 100).Exec() // 检测事务执行状态 if err1 != nil || err2 != nil { // 如果执行失败,回滚事务 tx.Rollback() } else { // 任务执行成功,提交事务 tx.Commit() }
自动处理事务
在一个闭包函数内执行事务处理,如果函数返回error则回滚事务。
// 创建orm对象 o := orm.NewOrm() // 在闭包内执行事务处理 err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error { // 准备数据 user := new(User) user.Name = "test_transaction" // 插入数据 // 使用txOrm执行SQL _, e := txOrm.Insert(user) return e })
模型定义
复杂的模型定义不是必须的,此功能用作数据库数据转换和自动建表
默认的表名规则,使用驼峰转蛇形:
除了开头的大写字母以外,遇到大写会增加 _
,原名称中的下划线保留。
版权声明本文仅代表作者观点,不代表本站立场。本文系作者授权发表,未经许可,不得转载。图文来源网络,侵权删!