golang从SQL文件或DSN生成gorm/xorm/sqlx/bun代码插件库sqlgen的使用

sqlgen

sqlgen是一个从SQL文件生成bungormsqlsqlxxorm 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

工作原理

  1. 创建一个SQL文件
  2. 在SQL文件中编写你的SQL代码
  3. 运行sqlgen生成代码

注意事项

  1. 目前仅支持MySQL代码生成
  2. 不支持在一个SQL文件中包含多张表
  3. 不支持JOIN查询

完整示例

以下是一个完整的示例,展示如何使用sqlgen从SQL文件生成GORM代码:

  1. 首先创建一个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;
  1. 运行sqlgen命令生成代码:
sqlgen -type gorm -file user.sql -out user_model.go
  1. 生成的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

1 回复

更多关于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

注意事项

  1. 确保数据库连接信息正确
  2. 生成的代码可能需要根据项目需求进行微调
  3. 对于复杂数据库关系,可能需要手动补充关联关系
  4. 定期更新sqlgen工具以获取最新功能

sqlgen极大简化了从数据库schema到Go模型代码的转换过程,特别适合快速启动新项目或在现有项目中添加新表时使用。

回到顶部