13

Golang 语言 Web 框架 beego v2 之写操作

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA4Mjc1NTMyOQ%3D%3D&%3Bmid=2247484196&%3Bidx=1&%3Bsn=9f7615cd69a71d535446ceb0d27b0793
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

01

介绍

beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自

Django ORM 和 SQLAlchemy。

已支持的数据库驱动有MySQL、PostgreSQL 和 Sqlite3。

beego v2.x 和 beego v1.x 在 ORM 上的区别是,beego v2.x 的 ORM 对象被设计为无状态的,它是线程安全的,建议大家在使用时,一个数据库只对应一个 ORM 对象。

本文全篇都是以 MySQL 为例。

02

安装

如果您使用的是 beego 框架,beego ORM 已默认安装,如果您没有使用 beego 框架,可使用 go get 安装 beego ORM:

go get github.com/astaxie/beego/client/orm

03

注册

  • 注册驱动

    orm.RegisterDriver("mysql", orm.DRMySQL)

    参数 1 是驱动名称,参数 2 是驱动类型,需要注意的是,不要忘记导入 MySQL 驱动。

    import _ "github.com/go-sql-driver/mysql"
  • 注册数据库

    orm.RegisterDataBase("default", "mysql", "root:root@/beego_web?charset=utf8&loc=Local")

    beego ORM 必须注册一个别名为 default 的数据库,作为默认使用。参数 1 是数据库的别名,用来在 ORM 中切换数据库使用,参数 2 是驱动名称,参数 3 是对应的 dataSource。

    使用 go-sql-driver,驱动默认使用UTC 时间,如需使用本地时间,请设置 loc 的值为 Local。

  • 设置数据库最大空闲连接数

    orm.SetMaxIdleConns("default", 10)

    根据数据库的别名,设置数据库的最大空闲连接数。

  • 设置数据库最大连接数

  • orm.SetMaxOpenConns("default", 10)

    根据数据库的别名,设置数据库的最大连接数。

  • 注册模型

    orm.RegisterModel(new(User))

    注册模型,同时注册多个模型,使用英文逗号分隔。

  • 使用表前缀注册模型

    orm.RegisterModelWithPrefix("beego_", new(User))

    使用表前缀注册模型,同时注册多个模型,使用英文逗号分隔。

注册模型和使用表前缀注册模型,不可同时使用,重复注册模型,会导致成程序 panic。

04

自动建表

  • 默认表名

    默认的表名规则,是使用驼峰转蛇形,除了开头的大写字母外,遇到大写字母会增加下划线,并且原名已存在的下划线继续保留。

    AuthUser -> auth_user
    Auth_User -> auth__user
    DB_AuthUser -> d_b__auth_user
  • 自定义表名

    func (u *User) TableName() string {
    return "user"
    }

    如果设置了表前缀,自定义表名会在开头拼接上前缀。

  • 自定义存储引擎

    func (u *User) TableEngine() string {
    return "INNODB"
    }

    默认使用 MySQL 数据库设置的存储引擎,如果您需要在程序中指定存储引擎,可以使用以上方式设置。

  • 设置参数

    type User struct {
    Id uint64 `form:"-" orm:"auto;pk;description(主键 ID)"`
    Name string `form:"name" orm:"unique;size(30)";description(用户名)`
    Age uint8 `orm:"index;description(年龄)"`
    Created time.Time `orm:"auto_now_add;type(datetime)"`
    Updated time.Time `orm:"auto_now;type(datetime)"`
    }

    在结构体中,可以使用 orm 标签设置数据库的属性,限于篇幅,具体使用方法请参考官方手册。

  • 自动建表

    err := orm.RunSyncdb("default", false, true)
    if err != nil {
    log.Fatalln(err.Error())
    return
    }

参数 1 是数据库别名,参数 2 是布尔类型的 force,参数 3 是布尔类型的 verbose。force 为 true 代表 drop table 后再建表;verbose 为 true 代表打印建表的执行过程。

自动建表功能在 force 为 false 时,会自动创建新增的字段和索引。删除或修改操作,需要用户自行手动处理。

05

新增

单条插入:

func (u *UserController) Create() {
o := orm.NewOrm() // 创建一个 Ormer
name := u.GetString("name", "unknow")
age, _ := u.GetUint8("age", 0)
user := &models.User{
Name: name,
Age: age,
}
id, err := o.Insert(user)
if err != nil {
log.Fatalln(err.Error())
return
}
fmt.Println("id:", id)
}

Insert 方法插入单条数据,接收参数必须是指针类型,返回值有两个,分别是自增id 和 err。

批量插入:

func (u *UserController) Create() {
o := orm.NewOrm() // 创建一个 Ormer
users := []models.User{}
_ = json.Unmarshal(u.Ctx.Input.RequestBody, &users)
rows, err := o.InsertMulti(2, users)
if err != nil {
log.Fatalln(err)
return
}
fmt.Println("rows:", rows)
}

InsertMulti 方法批量插入数据,参数 1 是批量插入的数量,参数 2 是 slice,参数 1 的值为 1 时,将会按照顺序插入 slice 中的数据。返回值有两个,分别是插入行数和 err。

06

修改

func (u *UserController) Update() {
web.BConfig.WebConfig.AutoRender = false
o := orm.NewOrm()
user := models.User{}
_ = json.Unmarshal(u.Ctx.Input.RequestBody, &user)
rows, err := o.Update(&user, "Name")
if err != nil {
log.Println(err.Error())
return
}
fmt.Println("rows:", rows)
}

Update 方法更新数据,参数 1 是更新对象,参数 2 是更新的字段,多个字段用英文逗号分隔,默认更新多有字段。返回值有两个,分别是更新行数和err。

07

删除

func (u *UserController) Delete() {
web.BConfig.WebConfig.AutoRender = false
o := orm.NewOrm()
id, _ := u.GetUint64("id", 0)
user := models.User{
Id: id,
}
rows, err := o.Delete(&user)
if err != nil {
log.Println(err.Error())
return
}
fmt.Println("rows:", rows)
}

Delete 方法删除数据,参数是删除对象,返回值有两个,分别是更新行数和 err。

08

总结

本文开篇介绍了 beego ORM 的设计思路和已支持的数据库驱动,并且介绍了 v2 和 v1 的区别,然后详细介绍了 beego ORM 的安装和使用方法。关于更多细节,请参阅官方手册。

B3yUfqm.jpg!mobile

参考资料:

https://beego.me/docs


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK