golang通过SQL DDL自动生成GORM模型插件库godal的使用

golang通过SQL DDL自动生成GORM模型插件库godal的使用

GoDoc Codecov.io Go Report Card Mentioned in Awesome Go

godal提供了生成特定golang代码的能力,目标是让开发者能够以高效的方式编写快速代码。

功能

  1. 通过指定SQL DDL文件生成对应的Golang ORM模型,可用于GORM
  2. 后续更新

godal已被添加到awesome-go项目中

安装

使用此包需要安装Go环境并启用Go Modules。

安装godal的方法:

git clone git@github.com:mafulong/godal.git
cd godal
go install

确保执行which godal命令能看到结果。

SQL转Golang模型

godal gen model --database {数据库名} {SQL文件}

示例

进入该仓库的test目录执行:

godal gen model --database testdb gen_model.sql

生成的模型示例文件1:

package testdb

import "time"

type TestTb1 struct {
	TestId         int       `gorm:"Column:test_id" json:"test_id"`
	TestTitle      string    `gorm:"Column:test_title" json:"test_title"`
	TestAuthor     string    `gorm:"Column:test_author" json:"test_author"`
	SubmissionDate time.Time `gorm:"Column:submission_date" json:"submission_date"`
}

func (TestTb1) TableName() string {
	return "test_tb1"
}

许可证

MIT许可证。


更多关于golang通过SQL DDL自动生成GORM模型插件库godal的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通过SQL DDL自动生成GORM模型插件库godal的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用godal自动从SQL DDL生成GORM模型

godal是一个能够从SQL DDL语句自动生成GORM模型的Go库,它可以显著提高开发效率,特别是在已有数据库结构需要映射到Go模型时。

godal安装

go get -u github.com/lingdor/godal

基本使用方法

1. 从SQL DDL生成GORM模型

package main

import (
	"fmt"
	"github.com/lingdor/godal"
)

func main() {
	// 定义SQL DDL语句
	sql := `
	CREATE TABLE users (
		id INT PRIMARY KEY AUTO_INCREMENT,
		username VARCHAR(50) NOT NULL,
		email VARCHAR(100) UNIQUE,
		age INT DEFAULT 18,
		created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
		updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
		deleted_at TIMESTAMP NULL
	);
	`

	// 生成GORM模型
	model, err := godal.GenerateModelFromSQL(sql, "users", "model")
	if err != nil {
		panic(err)
	}

	fmt.Println(model)
}

2. 生成的文件示例

上述代码会生成类似以下的GORM模型:

package model

import (
	"time"
	"gorm.io/gorm"
)

type User struct {
	ID        uint           `gorm:"primaryKey;autoIncrement"`
	Username  string         `gorm:"size:50;not null"`
	Email     string         `gorm:"size:100;unique"`
	Age       int            `gorm:"default:18"`
	CreatedAt time.Time      `gorm:"default:CURRENT_TIMESTAMP"`
	UpdatedAt time.Time      `gorm:"default:CURRENT_TIMESTAMP;autoUpdateTime"`
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

高级功能

1. 自定义标签和选项

options := godal.Options{
	TableName:  "users",
	Package:    "model",
	JSONTags:   true,       // 添加json标签
	GormTags:   true,       // 添加gorm标签
	Nullable:   true,       // 处理可为NULL的字段
	WithGormDB: false,      // 不生成DB相关方法
}

model, err := godal.GenerateModelFromSQLWithOptions(sql, options)

2. 从数据库直接生成

godal还支持直接从数据库连接生成模型:

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"github.com/lingdor/godal"
)

func main() {
	db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	// 从数据库表生成模型
	model, err := godal.GenerateModelFromDB(db, "users", "model")
	if err != nil {
		panic(err)
	}

	fmt.Println(model)
}

3. 生成CRUD方法

options := godal.Options{
	TableName:  "users",
	Package:    "model",
	WithGormDB: true, // 生成基本的CRUD方法
}

model, err := godal.GenerateModelFromSQLWithOptions(sql, options)

这会生成包含基本CRUD操作的结构体和方法。

实际应用示例

假设我们有一个博客系统的数据库表:

CREATE TABLE posts (
	id INT PRIMARY KEY AUTO_INCREMENT,
	title VARCHAR(255) NOT NULL,
	content TEXT,
	author_id INT NOT NULL,
	status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
	created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
	FOREIGN KEY (author_id) REFERENCES users(id)
);

使用godal生成模型:

package main

import (
	"fmt"
	"github.com/lingdor/godal"
)

func main() {
	sql := `...上面的SQL语句...`

	options := godal.Options{
		TableName:  "posts",
		Package:    "model",
		JSONTags:   true,
		GormTags:   true,
		WithGormDB: true,
	}

	model, err := godal.GenerateModelFromSQLWithOptions(sql, options)
	if err != nil {
		panic(err)
	}

	// 保存到文件
	err = godal.SaveModelToFile(model, "model/posts.go")
	if err != nil {
		panic(err)
	}

	fmt.Println("模型已生成并保存到 model/posts.go")
}

生成的结果文件会包含适当的GORM标签和关联关系。

注意事项

  1. godal目前主要支持MySQL语法,对其他数据库的支持可能有限
  2. 复杂的关系可能需要手动调整生成的代码
  3. 生成的模型可以作为起点,但可能需要根据业务需求进行修改
  4. 建议将生成代码与手写代码分开管理

godal可以显著减少编写样板代码的时间,特别是在已有数据库结构的情况下,能够快速生成对应的GORM模型,提高开发效率。

回到顶部