gorm使用gen自动生成模型和查询文件

项目使用的gin,整合的gorm,可以利用gen工具快速生成模型和查询文件

package database

import (
	"fmt"
	"sync"
	"time"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
)

var (
	instance *gorm.DB
	once     sync.Once
)

func Instance() *gorm.DB {
	once.Do(func() {
		var err error
		dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
			viper.GetString("database.user"),
			viper.GetString("database.pass"),
			viper.GetString("database.host"),
			viper.GetInt("database.port"),
			viper.GetString("database.name"))
  		instance, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
  		if err != nil {
  			panic("数据库连接失败")
  		}
	})

	if viper.GetBool("database.debug") {
		instance = instance.Debug()
	}

	generator := gen.NewGenerator(gen.Config{
		OutPath: "./app/dao",
		Mode: gen.WithDefaultQuery | gen.WithQueryInterface,
	})
	generator.UseDB(instance)
    // 非常重要,不加不生成文件!
	generator.ApplyBasic(generator.GenerateAllTable()...)
	generator.Execute()
	db, _ := instance.DB()
	db.SetMaxIdleConns(10)
	db.SetMaxOpenConns(100)
	db.SetConnMaxLifetime(time.Hour)
	db.SetConnMaxIdleTime(30 * time.Minute)
	return instance
}

需要注意以下几点:

  • 如果你想定义model目录的路径,目前只支持绝对路径(如写成./app/models这样的相对路径是不行的)或者通过设置OutPathModelPkgPath,可以实现自定义模型路径
  • model生成位置:取OutPath路径中的目录(如OutPath是./app/dao,则目录是./app),再拼接上ModelPkgPath(如不设置ModelPkgPath,默认就叫model),拼接后最终model会生成在./app/model
  • generator.ApplyBasic(generator.GenerateAllTable()...)必须有这句,否则不生成任何modelquery文件
posted @ 2026-02-06 14:01  代码小伙  阅读(1)  评论(0)    收藏  举报