当前位置: 首页 > news >正文

全网最简 Gorm 教程 | Gorm 模型定义

模型定义

前面入门案例中,我们定义了User结构体用来和数据表users做映射,User结构体,我们称之为数据模型,在gorm框架中,操作数据库需要预先定义模型。

底层都是使用的golang的database标准库,利用反射原理,执行读写操作时,将结构体翻译为sql语句,并将结果转化为对应的模型。

1. 模型定义

假设有一个商品表

CREATETABLE`goods`(`id`int(10)unsignedNOTNULLAUTO_INCREMENTCOMMENT'自增ID,商品Id',`name`varchar(30)NOTNULLCOMMENT'商品名',`price`decimal(10,2)unsignedNOTNULLCOMMENT'商品价格',`type_id`int(10)unsignedNOTNULLCOMMENT'商品类型Id',`createtime`int(10)NOTNULLDEFAULT0COMMENT'创建时间',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4

将上述表翻译为模型后,如下:

typeGoodstruct{Idint//表字段名为:idNamestring//表字段名为:namePricefloat64//表字段名为:priceTypeIdint//表字段名为:type_idCreateTimeint64`gorm:"column:createtime"`//表字段名为:createtime}

默认gorm对struct字段名使用Snake Case命名风格转换成mysql表字段名(需要转换成小写字母)。

Snake Case命名风格,就是各个单词之间用下划线(_)分隔,例如: CreateTime的Snake Case风格命名为create_time

同时默认情况下,使用ID做为其主键,使用结构体名称的Snake Case风格的复数形式做为表名,使用CreatedAtUpdatedAt字段追踪创建、更新时间。

2. 模型标签

标签定义:

`gorm:"标签内容"`

标签定义部分,多个标签定义可以使用分号(;)分隔

gorm常用标签如下:

标签说明例子
column指定列名gorm:"column:createtime"
primaryKey指定主键gorm:"column:id; PRIMARY_KEY"
-忽略字段gorm:"-"可以忽略struct字段,被忽略的字段不参与gorm的读写操作

其他的可以查看官方文档:https://gorm.io/zh_CN/docs/models.html#embedded_struct

3. 表名映射

  • 复数表名,比如结构体User,默认的表名为users

  • 实现Tabler接口 (TableName不支持动态变化,它会被缓存下来以便后续使用。)

    typeTablerinterface{TableName()string}// TableName 会将 User 的表名重写为 `profiles`func(User)TableName()string{return"profiles"}
  • 动态表名,使用Scopes

funcUserTable(user User)func(tx*gorm.DB)*gorm.DB{returnfunc(tx*gorm.DB)*gorm.DB{ifuser.Admin{returntx.Table("admin_users")}returntx.Table("users")}}db.Scopes(UserTable(user)).Create(&user)
  • 临时表名

    db.Table("deleted_users")

4. Model

GORM 定义一个gorm.Model结构体,其包括字段IDCreatedAtUpdatedAtDeletedAt

// gorm.Model 的定义typeModelstruct{IDuint`gorm:"primaryKey"`CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt`gorm:"index"`}

GORM 约定使用CreatedAtUpdatedAt追踪创建/更新时间。如果定义了这种字段,GORM 在创建、更新时会自动填充当前时间。

要使用不同名称的字段,您可以配置 autoCreateTime、autoUpdateTime 标签

如果想要保存 UNIX(毫/纳)秒时间戳,而不是 time,只需简单地将 time.Time 修改为 int 即可。

例子:

typeUserstruct{CreatedAt time.Time// 默认创建时间字段, 在创建时,如果该字段值为零值,则使用当前时间填充UpdatedAtint// 默认更新时间字段, 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充Updatedint64`gorm:"autoUpdateTime:nano"`// 自定义字段, 使用时间戳填纳秒数充更新时间Updatedint64`gorm:"autoUpdateTime:milli"`//自定义字段, 使用时间戳毫秒数填充更新时间Createdint64`gorm:"autoCreateTime"`//自定义字段, 使用时间戳秒数填充创建时间}

可以将它嵌入到您的结构体中,以包含这几个字段,比如

typeUserstruct{gorm.Model Namestring}// 等效于typeUserstruct{IDuint`gorm:"primaryKey"`CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt`gorm:"index"`Namestring}

对于正常的结构体字段,你也可以通过标签embedded将其嵌入,例如:

typeAuthorstruct{NamestringEmailstring}typeBlogstruct{IDintAuthor Author`gorm:"embedded"`Upvotesint32}// 等效于typeBlogstruct{IDint64NamestringEmailstringUpvotesint32}

可以使用标签embeddedPrefix来为 db 中的字段名添加前缀,例如:

typeBlogstruct{IDintAuthor Author`gorm:"embedded;embeddedPrefix:author_"`Upvotesint32}// 等效于typeBlogstruct{IDint64AuthorNamestringAuthorEmailstringUpvotesint32}

5. 数据库连接

GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

连接数据库主要是两个步骤:

  • 配置DSN (Data Source Name)
  • 使用gorm.Open连接数据库

5.1 DSN

gorm库使用dsn作为连接数据库的参数,dsn翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息。

格式:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

mysql的dsn的一些例子:

//mysql dsn格式//涉及参数://username 数据库账号//password 数据库密码//host 数据库连接地址,可以是Ip或者域名//port 数据库端口//Dbname 数据库名username:password@tcp(host:port)/Dbname?charset=utf8&parseTime=True&loc=Local//填上参数后的例子//username = root//password = 123456//host = localhost//port = 3306//Dbname = gorm//后面K/V键值对参数含义为:// charset=utf8 客户端字符集为utf8// parseTime=true 支持把数据库datetime和date类型转换为golang的time.Time类型// loc=Local 使用系统本地时区root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local//gorm 设置mysql连接超时参数//开发的时候经常需要设置数据库连接超时参数,gorm是通过dsn的timeout参数配置//例如,设置10秒后连接超时,timeout=10s//下面是完成的例子root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local&timeout=10s//设置读写超时时间// readTimeout - 读超时时间,0代表不限制// writeTimeout - 写超时时间,0代表不限制root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=60s

要支持完整的 UTF-8 编码,您需要将charset=utf8更改为charset=utf8mb4

5.2 连接数据库

import("gorm.io/driver/mysql""gorm.io/gorm")funcmain(){// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情dsn:="user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db,err:=gorm.Open(mysql.Open(dsn),&gorm.Config{})}

MySQL 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:

db,err:=gorm.Open(mysql.New(mysql.Config{DSN:"gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local",// DSN data source nameDefaultStringSize:256,// string 类型字段的默认长度DisableDatetimePrecision:true,// 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持DontSupportRenameIndex:true,// 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引DontSupportRenameColumn:true,// 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列SkipInitializeWithVersion:false,// 根据当前 MySQL 版本自动配置}),&gorm.Config{})

GORM 允许通过DriverName选项自定义 MySQL 驱动,例如:

import(_"example.com/my_mysql_driver""gorm.io/driver/mysql""gorm.io/gorm")db,err:=gorm.Open(mysql.New(mysql.Config{DriverName:"my_mysql_driver",DSN:"gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local",// data source name, 详情参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name}),&gorm.Config{})

5.3 调试模式

db.Debug()

5.4 连接池配置

sqlDB,_:=db.DB()//设置数据库连接池参数sqlDB.SetMaxOpenConns(100)//设置数据库连接池最大连接数sqlDB.SetMaxIdleConns(20)//连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭
http://www.jsqmd.com/news/1112233/

相关文章:

  • 2026年主流企业网盘深度测评+选型推荐|初创/中大型/涉密企业全覆盖
  • 基于IIM-42652 IMU的6DoF运动追踪系统设计与实现
  • 美国悬赏1000万美元,征集有关俄罗斯黑客攻击Signal账户的信息
  • 5.7万 Star!GitHub 爆火的 AI 求职神器
  • crictl 实战指南:没有 docker 命令后,Kubernetes 节点该怎么排障?
  • AI技术现状与未来:从大模型能力边界到开发者转型
  • 数据中心液冷沙盘模型控制系统设计与实现:基于STM32与Modbus RTU的实战方案
  • 如何快速掌握STM32嵌入式开发:5个实战项目从零到精通的完整指南
  • AI智能体工作流开发实战:从原理到应用
  • AI工程能力五维体检表:数据可信、小样本鲁棒、多模态对齐、边缘实时、人机协同
  • TeamCity 发布 2026.1.2 和 2025.11.6 版本:修复 10 多个问题,保障服务器安全
  • 单目3D远程呈现技术:3D高斯溅射与低带宽实时渲染
  • 3个步骤让你的B站收藏夹变成个人视频库:bilibili-downloader完全指南
  • [AI][昇腾950]MixCore 最高效同步
  • 2026免费图片去水印工具推荐!无广告在线网站、电脑软件、手机APP汇总
  • 3步搞定缠论自动化分析:通达信插件终极安装指南
  • ComfyUI Flux插件:多Lora模型混合加载与优化指南
  • HoRain云--C++预处理器核心机制与最佳实践
  • 从0到上线仅4小时:某跨国企业用ChatGPT+本地ASR搭建会议纪要流水线(吞吐量200+场/日,错误率<0.8%)
  • Python 自动化之文件批量整理——重命名、分类归档、清理重复
  • Ollama本地大模型部署指南:从安装到应用实战
  • 5分钟快速上手:原神抽卡记录导出与数据分析终极指南
  • 终极指南:如何使用TradSimpChinese插件快速实现Calibre繁简中文转换
  • MC6470与PIC18F87J50组合在嵌入式系统中的应用
  • 【BUG已解决】macOS zsh: command not found: python 解决方案
  • Unlock-Music:3种方式解锁加密音乐,让音乐真正属于你
  • AI海报设计新范式:Agent驱动图层分离技术实现可编辑生成
  • Windows 10终极优化指南:一键清理系统臃肿,释放电脑真正性能!
  • Web渗透测试学习路线:从零基础到实战的完整指南
  • AI Berkshire:多Agent协作的价值投资框架,让AI成为你的专业投研团队