Beego 使用教程 9:ORM 操作数据库(上)

beego 是一个用于Go编程语言的开源、高性能的 web 框架

beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask

beego 官网:http://beego.gocn.vip/

上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》

注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了

beego 官方 github 仓库:https://github.com/beego/beego

上一讲,讲了 beego 页面视图,需要的朋友可以查看《Beego 使用教程 8:Session 和 Cookie》

这一讲,讲解 ORM 操作数据库。代码使用上一讲的代码

1、基本使用

新建数据库 beego-demo-db,建表 sql 看下面

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

安装依赖,执行下面命令

go get github.com/go-sql-driver/mysql
go mod tidy

在项目根目录下,新建dao文件目录,在dao 目录下新建 user.go,user.go 代码是下面内容

package dao

import (
	"github.com/beego/beego/v2/client/orm"
	//匿名引入mysql驱动
	_ "github.com/go-sql-driver/mysql"
)

type User struct {
	Id   int    `orm:"auto"`
	Name string `orm:"column(name)"`
	Age  int    `orm:"column(age)"`
}

func init() {
	// 注册 User 结构体模型
	orm.RegisterModel(new(User))

	orm.RegisterDataBase("default", "mysql", "root:123456@tcp(192.168.3.232:3306)/beego-demo-db?charset=utf8")
}

func Add() {
	o := orm.NewOrm()

	user := new(User)
	user.Name = "贾元春"
	user.Age = 25

	// 添加数据
	o.Insert(user)
}

在 controller 目录下新建 dao.go ,dao.go 代码是下面

package controller

import (
	"beego-demo/dao"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
)

func RegisterDaoRoutes() {
	web.Get("/user/add", func(ctx *context.Context) {
		dao.Add()
		ctx.WriteString("添加成功")
	})
}

运行测试

浏览器访问:http://localhost:9090/user/add

2、数据库设置

最大连接数

最大连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxOpenConnections 选项

orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxOpenConnections(100))

也可以在注册之后修改

orm.SetMaxOpenConns("default", 30)

最大空闲连接数

最大空闲连接数的设置有两种方式,一种方式是在注册数据库的时候,使用MaxIdleConnections选项

orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", orm.MaxIdleConnections(20))

注册之后修改

orm.SetMaxIdleConns("default", 30)

3、注册驱动

大多数时候,你只需要使用默认的那些驱动,有

	DRMySQL                      // mysql
	DRSqlite                     // sqlite
	DROracle                     // oracle
	DRPostgres                   // pgsql
	DRTiDB                       // TiDB

如果你需要注册自定义的驱动,可以使用

// 参数1   driverName
// 参数2   数据库类型
// 这个用来设置 driverName 对应的数据库类型
// mysql / sqlite3 / postgres / tidb 这几种是默认已经注册过的,所以可以无需设置
orm.RegisterDriver("mysql", yourDriver)

4、模型定义与注册

Beego 的 ORM 模块要求在使用之前要先注册好模型,并且 Beego 会执行一定的校验,用于辅助检查模型和模型之间的约束。并且模型定义也会影响自动建表功能自动建表

Beego 的模型定义,大部分都是依赖于 Go 标签特性,可以设置多个特性,用;分隔。同一个特性的不同值使用,来分隔

orm:"null;rel(fk)"

注册模型有三个方法

4.1、模型基本设置

表名

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

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

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

也可以自定义表名,只需要实现接口TableNameI

type User struct {
	Id int
	Name string
}

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

同时,也可以在注册模型的时候为表名加上前缀或者后缀

为字段设置 DB 列的名称

Name string `orm:"column(user_name)"`

忽略字段
设置 - 即可忽略模型中的字段

type User struct {
  // ...
	AnyField string `orm:"-"`
  //...
}

索引
默认情况下,可以在字段定义里面使用 Go 的标签功能指定索引,包括指定唯一索引。

例如,为单个字段增加索引

Name string `orm:"index"`

或者,为单个字段增加 unique 键

Name string `orm:"unique"`

实现接口TableIndexI,可以为单个或多个字段增加索引

type User struct {
	Id    int
	Name  string
	Email string
}

// 多字段索引
func (u *User) TableIndex() [][]string {
	return [][]string{
		[]string{"Id", "Name"},
	}
}

// 多字段唯一键
func (u *User) TableUnique() [][]string {
	return [][]string{
		[]string{"Name", "Email"},
	}
}

主键
可以用auto显示指定一个字段为自增主键,该字段必须是 int, int32, int64, uint, uint32, 或者 uint64

MyId int32 `orm:"auto"`

如果一个模型没有定义主键,那么 符合上述类型且名称为 Id 的模型字段将被视为自增主键。

如果不想使用自增主键,那么可以使用pk设置为主键

Name string `orm:"pk"`

注意,目前 Beego 的非自增主键和联合主键支持得不是特别好。建议普遍使用自增主键

鉴于 go 目前的设计,即使使用了 uint64,但你也不能存储到他的最大值。依然会作为 int64 处理

默认值
默认值是一个扩展功能,必须要显示注册默认值的Filter,而后在模型定义里面加上default的设置

import (
"github.com/beego/beego/v2/client/orm/filter/bean"
"github.com/beego/beego/v2/client/orm"
)

type DefaultValueTestEntity struct {
Id            int
Age           int `default:"12"`
AgeInOldStyle int `orm:"default(13);bee()"`
AgeIgnore     int
}

func XXX() {
    builder := bean.NewDefaultValueFilterChainBuilder(nil, true, true)
    orm.AddGlobalFilterChain(builder.FilterChain)
    o := orm.NewOrm()
    _, _ = o.Insert(&User{
        ID: 1,
        Name: "Tom",
    })
}

自动更新时间

Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
  • auto_now 每次 model 保存时都会对时间自动更新
  • auto_now_add 第一次保存时才设置时间

对于批量的 update 此设置是不生效的

引擎

仅支持 MySQL,只需要实现接口TableEngineI。

默认使用的引擎,为当前数据库的默认引擎,这个是由你的 mysql 配置参数决定的。

你可以在模型里设置 TableEngine 函数,指定使用的引擎

type User struct {
	Id    int
	Name  string
	Email string
}

// 设置引擎为 INNODB
func (u *User) TableEngine() string {
	return "INNODB"
}

null

数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL

Name string `orm:"null"`

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

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)"`

Precision

datetime字段设置精度值位数,不同 DB 支持最大精度值位数也不一致

type User struct {
	...
	Created time.Time `orm:"type(datetime);precision(4)"`
	...
}

Comment

为字段添加注释

type User struct {
	...
	Status int `orm:"default(1);description(这是状态字段)"`
	...
}

注意: 注释中禁止包含引号

4.2、模型字段与数据库类型的映射

在此列出 ORM 推荐的对应数据库类型,自动建表功能也会以此为标准。

默认所有的字段都是 NOT NULL

这里只列出来 mysql 数据库的对应类型,更多的数据库请查看官方文档

下一讲:《Beego 使用教程 10:ORM 操作数据库(下)》

至此完

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用beego操作mysql数据库实现增删改查的示例代码: ```go package controllers import ( "github.com/astaxie/beego" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) type UserController struct { beego.Controller } type User struct { Id int Name string Age int } func init() { orm.RegisterDriver("mysql", orm.DRMySQL) orm.RegisterDataBase("default", "mysql", "root:password@tcp(127.0.0.1:3306)/test?charset=utf8") orm.RegisterModel(new(User)) orm.RunSyncdb("default", false, true) } func (c *UserController) AddUser() { o := orm.NewOrm() user := User{Name: "Tom", Age: 20} id, err := o.Insert(&user) if err == nil { c.Ctx.WriteString("Insert user success, id: " + string(id)) } else { c.Ctx.WriteString("Insert user failed, err: " + err.Error()) } } func (c *UserController) GetUser() { o := orm.NewOrm() user := User{Id: 1} err := o.Read(&user) if err == nil { c.Ctx.WriteString("Get user success, name: " + user.Name + ", age: " + string(user.Age)) } else { c.Ctx.WriteString("Get user failed, err: " + err.Error()) } } func (c *UserController) UpdateUser() { o := orm.NewOrm() user := User{Id: 1} if o.Read(&user) == nil { user.Age = 22 if num, err := o.Update(&user); err == nil { c.Ctx.WriteString("Update user success, num: " + string(num)) } else { c.Ctx.WriteString("Update user failed, err: " + err.Error()) } } } func (c *UserController) DeleteUser() { o := orm.NewOrm() user := User{Id: 1} if num, err := o.Delete(&user); err == nil { c.Ctx.WriteString("Delete user success, num: " + string(num)) } else { c.Ctx.WriteString("Delete user failed, err: " + err.Error()) } } ``` 这段代码演示了如何使用beegoORM模块连接mysql数据库,并实现增删改查操作。其中,init函数用于注册数据库驱动和连接数据库;AddUser函数用于新增用户;GetUser函数用于查询用户;UpdateUser函数用于更新用户;DeleteUser函数用于删除用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世君子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值