惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security @ Cisco Blogs
H
Hacker News: Front Page
P
Privacy International News Feed
N
News and Events Feed by Topic
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
K
Kaspersky official blog
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
Security Latest
Security Latest
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
L
Lohrmann on Cybersecurity
Jina AI
Jina AI
P
Proofpoint News Feed
AI
AI
雷峰网
雷峰网
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 叶小钗
Webroot Blog
Webroot Blog
Apple Machine Learning Research
Apple Machine Learning Research
SecWiki News
SecWiki News
罗磊的独立博客
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
Schneier on Security
Schneier on Security
The GitHub Blog
The GitHub Blog
S
Security Affairs
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
月光博客
月光博客
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Securelist
W
WeLiveSecurity
T
Troy Hunt's Blog
A
Arctic Wolf
博客园 - 司徒正美

博客园 - 代码小伙

gin框架使用zap,在日志中加入trace_id Go使用base64Captcha生成字母验证码 GoFrame框架查询数据表时对字段取别名 GoFrame框架使用WherePri报错原因 GoFrame框架使用BindHandler设置路由失效的原因 GoFrame框架WebServer默认端口号是什么 GoFrame框架SetFileServerEnabled关闭静态服务不生效 vite修改端口号 用路由方式写一个通用的微信小程序校验文件验证 手机网页通过微信deeplink实现wap支付 position:sticky失效原因分析 mysql把一个表的字段赋值到另一张表 基于jquery的countdown插件实现毫秒倒计时 Vue打包代码如何部署在ThinkPHP项目里 保姆级教程,centos7安装erlang和rabbitmq Element Plus表单resetFields重置表单无效 thinkphp6通过中间件设置跨域 centos7安装jdk vue3中使用swiper6实现轮播
gorm使用gen自动生成模型和查询文件
代码小伙 · 2026-02-06 · via 博客园 - 代码小伙

项目使用的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文件