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 里

  1. res := make(orm.Params)

  2. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToMap(&res, "name", "value")

RowsToStruct

查询结果匹配到 struct 里

  1. res := new(Options)

  2. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToStruct(res, "name", "value")

构造查询

  1. qb, _ := orm.NewQueryBuilder("mysql")

  2. // 构建查询对象

  3. qb.Select("user.name",

  4.    "profile.age").

  5.    From("user").

  6.    InnerJoin("profile").On("user.id_user = profile.fk_user").

  7.    Where("age > ?").

  8.    OrderBy("name").Desc().

  9.    Limit(10).Offset(0)

  10. // 导出 SQL 语句

  11. sql := qb.String()

  12. // 执行 SQL 语句

  13. o := orm.NewOrm()

  14. 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
})


模型定义

复杂的模型定义不是必须的,此功能用作数据库数据转换和自动建表

默认的表名规则,使用驼峰转蛇形:

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

版权声明本文仅代表作者观点,不代表本站立场。本文系作者授权发表,未经许可,不得转载。图文来源网络,侵权删!

搜索