golang从SQL文件或DSN生成gorm/xorm/sqlx/bun代码插件库sqlgen的使用
sqlgen
sqlgen是一个从SQL文件生成bun、gorm、sql、sqlx和xorm SQL代码的工具,其灵感来源于:
- go-zero
- goctl
- sqlc
安装
go install github.com/anqiansong/sqlgen@latest
示例
参考example
查询规则
1. 函数名
你可以通过行注释中的fn
关键字定义函数,例如:
-- fn: my_func
SELECT *
FROM user;
它将生成如下代码:
func (m *UserModel) my_func (...) {
...
}
2. 获取单条记录
如果你想只获取一条记录,必须明确使用limit 1
表达式,例如:
-- fn: FindOne
select *
from user
where id = ? limit 1;
3. 标记还是值?
对于SQL的参数,你可以使用?
或明确的值来标记它们,在sqlgen中,这些参数将被转换为变量。例如,以下查询是等价的:
注意:此规则不适用于规则2
-- fn: FindLimit
select *
from user
where id = ?;
-- fn: FindLimit
select *
from user
where id = 1;
4. SQL函数
sqlgen支持SQL中的聚合函数查询,除此之外,其他函数目前暂不支持。所有聚合函数查询表达式必须包含AS表达式,例如:
-- fn: CountAll
select count(*) as count
from user;
更多查询示例可以参考example.sql
工作原理
- 创建一个SQL文件
- 在SQL文件中编写你的SQL代码
- 运行
sqlgen
生成代码
注意事项
- 目前仅支持MySQL代码生成
- 不支持在一个SQL文件中包含多张表
- 不支持JOIN查询
完整示例
以下是一个完整的示例,展示如何使用sqlgen从SQL文件生成GORM代码:
- 首先创建一个SQL文件
user.sql
:
-- 用户表
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`)
);
-- fn: CreateUser
-- 创建用户
INSERT INTO user (name, age) VALUES (?, ?);
-- fn: FindUserByID
-- 根据ID查找用户
SELECT * FROM user WHERE id = ? LIMIT 1;
-- fn: CountUsers
-- 统计用户数量
SELECT COUNT(*) AS count FROM user;
- 运行sqlgen命令生成代码:
sqlgen -type gorm -file user.sql -out user_model.go
- 生成的
user_model.go
文件内容示例:
package model
import (
"gorm.io/gorm"
)
type User struct {
ID int64 `gorm:"column:id;primaryKey;autoIncrement"`
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
}
type UserModel struct {
db *gorm.DB
}
func NewUserModel(db *gorm.DB) *UserModel {
return &UserModel{db: db}
}
// CreateUser 创建用户
func (m *UserModel) CreateUser(name string, age int) error {
return m.db.Exec("INSERT INTO user (name, age) VALUES (?, ?)", name, age).Error
}
// FindUserByID 根据ID查找用户
func (m *UserModel) FindUserByID(id int64) (*User, error) {
var result User
err := m.db.Raw("SELECT * FROM user WHERE id = ? LIMIT 1", id).Scan(&result).Error
return &result, err
}
// CountUsers 统计用户数量
func (m *UserModel) CountUsers() (int64, error) {
var count int64
err := m.db.Raw("SELECT COUNT(*) AS count FROM user").Scan(&count).Error
return count, err
}
更多关于golang从SQL文件或DSN生成gorm/xorm/sqlx/bun代码插件库sqlgen的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang从SQL文件或DSN生成gorm/xorm/sqlx/bun代码插件库sqlgen的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用sqlgen从SQL/DSN生成GORM/XORM/SQLX/BUN代码
sqlgen是一个强大的Go代码生成工具,可以从SQL文件或数据库DSN自动生成GORM、XORM、SQLX或Bun的模型代码。下面我将详细介绍如何使用这个工具。
安装sqlgen
首先需要安装sqlgen工具:
go install github.com/smallnest/sqlgen@latest
基本使用方法
1. 从SQL文件生成
假设你有一个schema.sql
文件:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
生成GORM模型代码:
sqlgen -driver mysql -sql schema.sql -template gorm -out models/gorm_models.go
生成XORM模型代码:
sqlgen -driver mysql -sql schema.sql -template xorm -out models/xorm_models.go
2. 从DSN生成
直接从数据库生成模型代码:
sqlgen -driver mysql -dsn "user:password@tcp(localhost:3306)/dbname" -template gorm -out models/gorm_models.go
配置选项
sqlgen支持多种配置选项:
-driver
: 数据库驱动(mysql/postgres/sqlite3等)-dsn
: 数据库连接字符串-sql
: SQL文件路径-template
: 输出模板(gorm/xorm/sqlx/bun)-out
: 输出文件路径-pkg
: 生成的包名(默认为"models")-json
: 生成JSON标签(默认为true)-guregu
: 使用guregu的null类型
示例生成的GORM代码
生成的GORM模型代码示例:
package models
import (
"time"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string `gorm:"column:name;type:varchar(100);not null" json:"name"`
Email string `gorm:"column:email;type:varchar(100);unique" json:"email"`
CreatedAt time.Time `gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"`
}
func (User) TableName() string {
return "users"
}
示例生成的XORM代码
生成的XORM模型代码示例:
package models
import (
"time"
"xorm.io/xorm"
)
type User struct {
Id int64 `xorm:"'id' pk autoincr" json:"id"`
Name string `xorm:"'name' varchar(100) not null" json:"name"`
Email string `xorm:"'email' varchar(100) unique" json:"email"`
CreatedAt time.Time `xorm:"'created_at' timestamp created" json:"created_at"`
}
func (u *User) TableName() string {
return "users"
}
高级用法
自定义模板
sqlgen支持自定义模板。你可以创建自己的模板文件:
sqlgen -driver mysql -dsn "user:password@tcp(localhost:3306)/dbname" -template mytemplate.tmpl -out models/custom_models.go
批量生成
生成所有表的模型:
sqlgen -driver mysql -dsn "user:password@tcp(localhost:3306)/dbname" -template gorm -out models -all
集成到项目工作流
建议将sqlgen集成到项目的Makefile中:
generate:
sqlgen -driver mysql -dsn "user:password@tcp(localhost:3306)/dbname" -template gorm -out internal/models/models.go
注意事项
- 确保数据库连接信息正确
- 生成的代码可能需要根据项目需求进行微调
- 对于复杂数据库关系,可能需要手动补充关联关系
- 定期更新sqlgen工具以获取最新功能
sqlgen极大简化了从数据库schema到Go模型代码的转换过程,特别适合快速启动新项目或在现有项目中添加新表时使用。