2024年了,go xorm生成mysql的结构体这么操作
ORM,即pobject-RelationlMapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
比较好的Go语言ORM包括:xorm与gorm
xorm 概述
xorm是一个Go语言的ORM库,通过它可以很方便的操作数据库。它的设计重点是高性能和易用性。XORM支持多种数据库,包括MySQL、PostgreSQL、SQLite、Oracle和SQL Server,并提供了丰富的查询语言。XORM还支持事务和缓存机制,可以提高数据库操作的性能。
xorm的官网:https://xorm.io/
根据结构体生成数据表
xorm支持根据结构体生成数据表,如果表不存在,则会自动创建。以mysql为例,示例代码如下:
type users struct {
Id int64 `xorm:"pk autoincr" json:"id"` //指定主键并自增
UserId int `xorm:"unique" json:"user_id"`
Name string `json:"name"`
Age int `json:"age"`
Address string `json:"address"`
CreateTime time.Time `xorm:"created" json:"create_time"`
UpdateTime time.Time `xorm:"updated" json:"update_time"`
}
func init() {
sqlStr := "root:123456@tcp(127.0.0.1:3306)/gin_demo?charset=utf8&parseTime=true&loc=Local"
var err error
//创建数据库引擎
myXorm, err = xorm.NewEngine("mysql", sqlStr)
if err != nil {
fmt.Println("数据库连接失败:", err)
}
//创建或者同步表,表名称是users
//如果数据表不存在,会根据users结构体自动创建
err = myXorm.Sync(new(users))
if err != nil {
fmt.Println("数据表同步失败:", err)
}
}
生成的数据表结构:
CREATE TABLE `users` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`user_id` bigint unsigned NOT NULL COMMENT '用户编号',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户姓名',
`age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '用户年龄',
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '地址',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `key_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
根据数据表生成结构体
踩坑
那么,有没有办法反过来,自定义好数据表结构,然后在代码中生成结构体?
查了很多资料,网上大部分的描述都是 通过 xorm 的 reverse命令反转一个数据库结构,生成代码。比如下面这样:
参考:https://www.cnblogs.com/liuzhongchao/p/9497326.html
解决方案
查了很多资料都和上面的解决方案类似,但是如今已经2024年9月了,我试了下上面的方案已经走不通了。后来根据xorm官网(https://xorm.io/) 的描述,现在需要安装reverse
才能实现。踩了一些列坑之后,总结方法和操作步骤如下:
- 安装 reverse:
go install xorm.io/reverse@latest
- 查看版本:
reverse -h
- 在项目的任意目录编辑配置文件
vim generate_db_struct.yml
,用来配置连接数据库的信息:
kind: reverse
name: users
source:
database: mysql
conn_str: 'root:123456@tcp(127.0.0.1:3306)/gin_demo?parseTime=true'
targets:
- type: codes
language: golang
output_dir: ./auto_generated
- 执行命令:
reverse -f generate_db_struct.yml
- 进入 auto_generated 目录查看,已生成
models.go
文件:
type Users struct {
Id uint `xorm:"not null pk autoincr comment('ID') UNSIGNED INT"`
UserId uint64 `xorm:"not null comment('用户编号') unique UNSIGNED BIGINT"`
Name string `xorm:"not null default '' comment('用户姓名') VARCHAR(255)"`
Age uint `xorm:"not null default 0 comment('用户年龄') UNSIGNED TINYINT"`
Address string `xorm:"not null default '' comment('地址') VARCHAR(255)"`
CreateTime time.Time `xorm:"not null default CURRENT_TIMESTAMP comment('添加时间') DATETIME"`
UpdateTime time.Time `xorm:"not null default CURRENT_TIMESTAMP comment('更新时间') DATETIME"`
}
更多参考:
https://blog.csdn.net/rxbook/article/details/132318225
https://www.cnblogs.com/rxbook/p/16012922.html
原文地址:https://blog.csdn.net/rxbook/article/details/142389030
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!