热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang【gorm】模型

阅读目录模型定义1模型定义商品表2模型标签3表名映射4Model5.数据库连接5.1DSN5.2连接数据库5.3调试模式5.4连接池配置模型定义前面入门案例中,我们

阅读目录

  • 模型定义
    • 1 模型定义商品表
    • 2 模型标签
    • 3 表名映射
    • 4 Model
    • 5. 数据库连接
      • 5.1 DSN
      • 5.2 连接数据库
      • 5.3 调试模式
      • 5.4 连接池配置


模型定义

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

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

1 模型定义商品表

CREATE TABLE `goods` (`id` INT (10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID,商品Id',`name` VARCHAR (30) NOT NULL COMMENT '商品名',`price` DECIMAL (10, 2) UNSIGNED NOT NULL COMMENT '商品价格',`type_id` INT (10) UNSIGNED NOT NULL COMMENT '商品类型Id',`createtime` INT (10) NOT NULL DEFAULT 0 COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4

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

type Good struct {Id int //表字段名为:idName string //表字段名为:namePrice float64 //表字段名为:priceTypeId int //表字段名为:type_idCreateTime int64 `gorm:"column:createtime"` //表字段名为:createtime
}

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

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

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

2 模型标签

标签定义:

`gorm:"标签内容"`

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

gorm 常用标签如下:

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

在这里插入图片描述

3 表名映射

复数表名,比如结构体 User,默认的表名为 users会缓存表名。

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

type Tabler interface {TableName() string
}// TableName 会将 User 的表名重写为 `profiles`
func (User) TableName() string {return "profiles"
}

动态表名,使用 Scopes。

func UserTable(user User) func (tx *gorm.DB) *gorm.DB {return func (tx *gorm.DB) *gorm.DB {if user.Admin {return tx.Table("admin_users")}return tx.Table("users")}
}db.Scopes(UserTable(user)).Create(&user)

临时表名

db.Table("deleted_users")

默认方式 - 推荐

type User struct {ID int64 // 主键//通过在字段后面的标签说明,定义golang字段和表字段的关系//例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为usernameUsername string `gorm:"column:username"`Password string `gorm:"column:password"`//创建时间,时间戳CreateTime int64 `gorm:"column:createtime"`
}// 设置表名
func (u User) TableName() string {return "users"
}

4 Model

GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {ID uint `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`
}

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

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

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

例子:

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

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

type User struct {gorm.ModelName string
}// 等效于
type User struct {ID uint `gorm:"primaryKey"`CreatedAt time.TimeUpdatedAt time.TimeDeletedAt gorm.DeletedAt `gorm:"index"`Name string
}

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

type Author struct {Name stringEmail string
}type Blog struct {ID intAuthor Author `gorm:"embedded"`Upvotes int32
}
// 等效于
type Blog struct {ID int64Name stringEmail stringUpvotes int32
}

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

type Blog struct {ID intAuthor Author `gorm:"embedded;embeddedPrefix:author_"`Upvotes int32
}// 等效于
type Blog struct {ID int64AuthorName stringAuthorEmail stringUpvotes int32
}

5. 数据库连接

GORM 官方支持的数据库类型有:

  • MySQL
  • PostgreSQL
  • SQlite
  • SQL Server

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

1、配置 DSN (Data Source Name)。
2、使用 gorm.Open 连接数据库。

5.1 DSN

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

格式:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=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"
)func main() {// 参考 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 data source nameDSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // string 类型字段的默认长度DefaultStringSize: 256, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持DisableDatetimePrecision: true,// 重命名索引时采用删除并新建的方式,// MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引DontSupportRenameIndex: true, // 用 `change` 重命名列,// MySQL 8 之前的数据库和 MariaDB 不支持重命名列DontSupportRenameColumn: true, // 根据当前 MySQL 版本自动配置SkipInitializeWithVersion: false,
}), &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)
//连接池最大允许的空闲连接数,
//如果没有sql任务需要执行的连接数大于20,
//超过的连接会被连接池关闭
sqlDB.SetMaxIdleConns(20)


推荐阅读
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了数据库并发控制的基本概念、重要性和具体实现方法。并发控制是确保多个事务在同时操作数据库时保持数据一致性的关键机制。文章涵盖了锁机制、多版本并发控制(MVCC)、乐观并发控制和悲观并发控制等内容。 ... [详细]
  • 本文讨论了在进行 MySQL 数据迁移过程中遇到的所有 .frm 文件报错的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 数据类型和操作数据表2.1MySQL类型之整型2.2MySQL数据类型之浮点型2.3日期时间型DATE1支持时间:1000年1月1日~9999年12月31日DATETIME ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
author-avatar
张馨桐等你2502895757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有