使用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能够处理大多数常见的数据库结构,包括字段类型映射、索引、外键关系等。对于复杂的数据库结构,生成后可能需要手动调整一些细节,但基础结构会自动生成完成。

回到顶部