Go|Go 笔记 - Beego 之 orm 表结构操作
代码:
package mainimport (
"github.com/beego/beego/v2/client/orm"
_ "github.com/go-sql-driver/mysql"
"log"
"time"
)/* 标签的使用:
1、用 beego orm 显示设置主键
2、ID 属性需要设置 int64 或者显示指定 pk
3、设置标签名使用:orm。多个标签使用分号分隔。
4、设置主键:pk(一般自动设置,自动找第一个 int64 类型设置为主键)
5、设置自动增长:auto(一般自动设置,自动找第一个 int64 类型设置为自动增长)
6、设置列名:column(name)
7、设置字符串类型:默认 varchar(255),设置长度使用 size(length)。其他字符串类型:type(text)
8、是否允许为 null:默认不允许。允许为 null,使用:null
9、默认值:default()
10、注释:description()
11、唯一索引:unique
12、设置索引:index
13、struct 字段的首字母必须大写,否则无法映射到数据库表(不创建对应的 column)
14、auto_now // 每次更新的时候自动设置属性为当前时间。不体现在 sql 中,是在 orm 代码执行过程中实现
15、auto_now_add // 当数据创建时设置为当前时间。不体现在 sql 中,是在 orm 代码执行过程中实现
16、时间:type(date)
17、默认引擎:InnoDB
*/type Account struct {
ID int64 `orm:"pk;
auto;
column(id)"`
// Idstring `orm:"pk"` // 强制设置为主键
// Namestring `orm:"size(64);
unique"`
Namestring `orm:"size(64)"`
Passwordstring `orm:"size(1024)"`
Birthday*time.Time
Telephonestring
Emailstring
Addrstring `orm:"default(中国北京)"`
Statusint8`orm:"default(1);
description(状态)"`
RoleIdint64
DepartmentId int64
CreatedAt*time.Time `orm:"auto_now_add;
"`
UpdatedAt*time.Time `orm:"auto_now;
"`
DeletedAt*time.Time `orm:"null;
"`
Descriptionstring`orm:"type(text)"`
Sexbool
Heightfloat64 `orm:"digits(10);
decimals(2)"` // 总共位数 10 位,小数位数 2 位
Weightfloat64
//heightfloat64
//weightfloat64
//Astring
//Bstring
//B int64
}/*
关联表的方法:
1、默认会根据 struct 名称生成对应的表。例如 type Account struct 则生成表 account 。
2、使用该方法后,则根据 return 返回的名称生成或者关联到表。例如 return "act" 首次执行则生成表 act 。后续执行则将变更更新到表 act 。
*/
func (account *Account) TableName() string {
return "act"
}// 创建索引
func (account *Account) TableIndex() [][]string {
return [][]string{
// 给 name 创建索引,并给 telephone 和 email 创建联合索引
{"name"},
{"telephone", "email"},
}
}func main() {
// 驱动名
driverName := "mysql"
//
databaseName := "default"dsn := "golang:123456@tcp(192.168.100.20:33060)/cmdb?charset=utf8mb4&parseTime=true"
// 注册数据库驱动到 orm
// 参数:自定义的数据库类型名,驱动类型(orm 中提供的)
orm.RegisterDriver(driverName, orm.DRMySQL)// 参数:beego 必须指定默认的数据库名称,使用的驱动名称(orm 驱动类型名),数据库的配置信息,数据库(连接池),连接(池)名称
err := orm.RegisterDataBase(databaseName, driverName, dsn)
if err != nil {
log.Fatal(err)
}// 定义结构
// 注册模型
orm.RegisterModel(new(Account))// 根据定义的结构体生成表(只同步表结构,不同步库。需要提前创建库)
// 第二个参数 force:如果为 true,则每次编译时都会重新生成表,即如果表已存在就删除并重建。如果为 false,则只更新列的变更
// 第三个参数 verbose:打印执行的 sql 语句
// orm.RunSyncdb(databaseName,false,true)
orm.RunSyncdb(databaseName, true, true)
}
sql 执行结果:
drop table `act`
DROP TABLE IF EXISTS `act`create table `act`
-- --------------------------------------------------
--Table Structure for `main.Account`
-- --------------------------------------------------
CREATE TABLE IF NOT EXISTS `act` (
`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(64) NOT NULL DEFAULT '' ,
`password` varchar(1024) NOT NULL DEFAULT '' ,
`birthday` datetime NOT NULL,
`telephone` varchar(255) NOT NULL DEFAULT '' ,
`email` varchar(255) NOT NULL DEFAULT '' ,
`addr` varchar(255) NOT NULL DEFAULT '中国北京' ,
`status` tinyint NOT NULL DEFAULT 1COMMENT '状态',
`role_id` bigint NOT NULL DEFAULT 0 ,
`department_id` bigint NOT NULL DEFAULT 0 ,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
`deleted_at` datetime,
`description` longtext NOT NULL,
`sex` bool NOT NULL DEFAULT FALSE ,
`height` numeric(10, 2) NOT NULL DEFAULT 0 ,
`weight` double precision NOT NULL DEFAULT 0
) ENGINE=InnoDB;
CREATE INDEX `act_name` ON `act` (`name`);
CREATE INDEX `act_telephone_email` ON `act` (`telephone`, `email`);
Process finished with exit code 0
生成的表:
MariaDB root@localhost:cmdb> desc act;
+---------------+---------------+------+-----+----------+----------------+
| Field| Type| Null | Key | Default| Extra|
+---------------+---------------+------+-----+----------+----------------+
| id| bigint(20)| NO| PRI | | auto_increment |
| name| varchar(64)| NO| MUL |||
| password| varchar(1024) | NO||||
| birthday| datetime| NO|| ||
| telephone| varchar(255)| NO| MUL |||
| email| varchar(255)| NO||||
| addr| varchar(255)| NO|| 中国北京 ||
| status| tinyint(4)| NO|| 1||
| role_id| bigint(20)| NO|| 0||
| department_id | bigint(20)| NO|| 0||
| created_at| datetime| NO|| ||
| updated_at| datetime| NO|| ||
| deleted_at| datetime| YES|| ||
| description| longtext| NO|| ||
| sex| tinyint(1)| NO|| 0||
| height| decimal(10,2) | NO|| 0.00||
| weight| double| NO|| 0||
+---------------+---------------+------+-----+----------+----------------+17 rows in set
Time: 0.008s
推荐阅读
- Golang 基础之数据类型梳理
- 计算机视觉|论文笔记(第一人称视角视频中的行人轨迹预测)
- Matplotlib|Python matplotlib seaborn(学习笔记)
- 笔记|BYOL(Bootstrap your own latent A new approach to self-supervised Learning)算法笔记
- Java实战之兼职平台系统的实现
- java|C++模板笔记
- Python|Python OpenCV学习之图像形态学
- 学习笔记|CSS Sprites(CSS图片精灵、雪碧图)看这里就够了
- 傻瓜笔记|2.7css精灵图 字体图标 三角 用户界面样式 布局技巧 文字溢出省略号
- javascript|JavaScript之变量作用域的介绍