gorm模型创建以及关键标签

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: gorm模型创建以及关键标签

模型

模型定义

什么是模型

模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成

人话:一个结构体,携带gorm规定的标签,或者实现了gorm的接口

作用:用模型就可以进行相关数据库的操作,比如说建表,对某个表的增删改查,一对一,一对多关系的联查等,是gorm进行各种操作的基础,一个书写良好的模型会让你对数据库的操作事半功倍

模型的约定

约定:GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

func main() {
  db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{})
  type User struct {
    ID           uint
    Name         string
    Email        *string
    Age          uint8
    Birthday     *time.Time
    MemberNumber sql.NullString
    ActivatedAt  sql.NullTime
    CreatedAt    time.Time
    UpdatedAt    time.Time
  }
  db.AutoMigrate(&User{})
}

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

type Model struct {
  ID        uint `gorm:"primarykey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt DeletedAt `gorm:"index"`
}

所以上面的模型我们可以修改为

type User struct {
  gorm.Model //嵌入结构体
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
}

嵌入结构体

当你有一个公用的结构体想要放入其他结构中的时候只需要以匿名结构体的形式放入它将会自动继承所有字段

type MyModel struct {
  UUid int
}
type User struct {
  gorm.Model
  MyModel
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
}

如果你不想用匿名结构你可以加入embedded标签让其嵌入

type MyModel struct {
  UUid int
}
type User struct {
  gorm.Model
  MyModel      MyModel `gorm:"embedded"`
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
}

关键标签embeddedPrefix:'前缀’通过这个来区分是不是匿名结构进入的

type User struct {
  gorm.Model
  MyModel      MyModel `gorm:"embedded;embeddedPrefix:prefix"`
  Name         string
  Age          uint8
}

关键标签

func main() {
  db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{})
  db.AutoMigrate(&User{})
}
type Model struct {
  UUID uint      `gorm:"primaryKey"`
  Time time.Time `gorm:"column:my_time"`
}
type User struct {
  Model        Model   `gorm:"embedded;embeddedPrefix:my_"`
  Name         string  `gorm:"default:wxf"`
  Email        *string `gorm:"not null"`
  Age          uint8   `gorm:"comment:年龄"`
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivatedAt  sql.NullTime
}

关联标签

后续会写,现在略过


相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
开发工具
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c(三)
348 0
|
Go 数据库
GORM模型与约定
GORM模型与约定
340 0
|
人工智能 Java 开发者
豆包MarsCode “一键Apply”功能测评:编程效率革新利器
豆包MarsCode的“一键Apply”功能旨在提升开发者编程效率,通过AI自动生成和应用代码,简化重复操作、精准修复错误、助力新项目开发及快速生成注释。安装插件后,在VSCode中与AI对话生成代码并点击Apply按钮即可完成应用,过程流畅高效。适用于C++、Java、Python等多语言环境,极大节省开发时间,降低手动操作风险。无论是资深开发者还是新手,都能从中受益,显著提升编程体验。
1228 9
|
Java 数据安全/隐私保护
Java面向对象编程:封装技术详解
Java面向对象编程:封装技术详解
269 0
|
安全 前端开发 JavaScript
如何检查和验证 HTML 中的 CSP 策略是否有效
本文介绍如何检查和验证 HTML 中的 Content Security Policy (CSP) 策略是否有效,包括使用浏览器开发者工具、在线验证工具和常见问题排查方法。
|
Go
Golang的time.NewTicker周期性定时器使用案例
这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
366 1
|
tengine 网络协议 应用服务中间件
WAF-HTTPS [Encrypted Alert]断开连接
WAF-HTTPS [Encrypted Alert]断开连接
16825 0
WAF-HTTPS [Encrypted Alert]断开连接
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
存储 负载均衡 Go
【Go 语言专栏】使用 Go 语言实现分布式数据库操作
【4月更文挑战第30天】本文探讨了使用Go语言实现分布式数据库操作,强调其在并发性能、网络编程、语法简洁和跨平台性上的优势。关键技术和步骤包括数据分片、数据同步、负载均衡及故障转移。通过实例分析和挑战解决,展示了Go语言在大规模数据处理中的高效与可靠性,为开发者提供指导。
411 0
|
canal 缓存 SpringCloudAlibaba
Springcloud Alibaba 使用Canal将MySql数据实时同步到Elasticsearch
本篇文章在Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性-CSDN博客 基础上使用canal将mysql数据实时同步到Elasticsearch。
455 0