使用GORM从现有数据库自动生成模型的最佳实践
使用GORM从现有数据库自动生成模型的最佳实践 大家好,我是Go语言的初学者(请多包涵),我正在使用一个现有的数据库,用Go语言重写一个原本用Node.js编写的服务。
有没有办法为这个现有数据库中的表生成模型?类似于SequelizeAuto这样的工具吗?
2 回复
请查看 Awesome Go 项目 的 ORM 部分。那里可能有一个 Go 语言的 ORM 可以从数据库生成模型。
对于从现有数据库自动生成GORM模型,可以使用gormt工具。这是一个专门为GORM设计的逆向工程工具,能够根据数据库结构自动生成Go结构体。
安装gormt
go get -u github.com/xxjwxc/gormt
或者使用预编译的二进制文件:
# Linux/Mac
wget https://github.com/xxjwxc/gormt/releases/download/v1.0.0/gormt_linux.tar.gz
tar -zxvf gormt_linux.tar.gz
# Windows
# 从release页面下载对应版本
基本使用示例
假设你有一个MySQL数据库,包含以下表:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
使用gormt生成模型:
# MySQL示例
gormt -H=127.0.0.1 -d=your_database -u=root -p=password --port=3306 --charset=utf8mb4
# 指定输出目录
gormt -H=127.0.0.1 -d=your_database -u=root -p=password -o=./model
# 使用配置文件
gormt -c=config.yaml
生成的模型示例
gormt会生成类似以下的Go结构体:
// 生成的users表模型
type Users struct {
ID int `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
Username string `gorm:"column:username;NOT NULL" json:"username"`
Email string `gorm:"column:email;NOT NULL" json:"email"`
CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at"`
UpdatedAt time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP" json:"updated_at"`
}
// TableName 指定表名
func (m *Users) TableName() string {
return "users"
}
// 生成的products表模型
type Products struct {
ID int `gorm:"column:id;primary_key;AUTO_INCREMENT" json:"id"`
Name string `gorm:"column:name;NOT NULL" json:"name"`
Price float64 `gorm:"column:price;type:decimal(10,2);NOT NULL" json:"price"`
UserID int `gorm:"column:user_id" json:"user_id"`
// 关联关系
User Users `gorm:"foreignKey:UserID;references:ID" json:"user"`
}
func (m *Products) TableName() string {
return "products"
}
配置文件示例
创建config.yaml:
database:
host: 127.0.0.1
port: 3306
username: root
password: your_password
database: your_database
charset: utf8mb4
out_dir: ./model
singular_table: true # 使用单数表名
is_json_tag: true # 生成json标签
is_foreign_key: true # 生成外键关联
其他选项
# 查看所有选项
gormt --help
# 常用选项:
--singular_table 使用单数表名(默认复数)
--is_json_tag 生成json标签
--is_foreign_key 生成外键关联
--is_out_sql 输出建表SQL
--is_out_func 输出CRUD函数
--is_gui 使用GUI界面
支持的数据库
- MySQL
- PostgreSQL
- SQLite
- SQL Server
使用生成的模型
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"./model" // 生成的模型路径
)
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/your_database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 使用生成的模型
var user model.Users
db.First(&user, 1)
fmt.Printf("User: %+v\n", user)
// 查询关联数据
var product model.Products
db.Preload("User").First(&product, 1)
fmt.Printf("Product with User: %+v\n", product)
}
gormt能够处理大多数常见的数据库结构,包括字段类型映射、索引、外键关系等。对于复杂的数据库结构,生成后可能需要手动调整一些细节,但基础结构会自动生成完成。

