gorm模型创建以及关键标签

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
简介: 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
}

关联标签

后续会写,现在略过


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
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(三)
381 0
|
Go 数据库
GORM模型与约定
GORM模型与约定
370 0
|
Java 数据安全/隐私保护
Java面向对象编程:封装技术详解
Java面向对象编程:封装技术详解
310 0
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
501 21
|
tengine 网络协议 应用服务中间件
WAF-HTTPS [Encrypted Alert]断开连接
WAF-HTTPS [Encrypted Alert]断开连接
16955 0
WAF-HTTPS [Encrypted Alert]断开连接
|
Go
Golang的time.NewTicker周期性定时器使用案例
这篇文章介绍了Golang中time包的NewTicker函数如何创建周期性定时器,并通过两个示例展示了如何使用定时器以及如何停止定时器。
406 1
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
关系型数据库 Unix 数据库
PostgreSQL语句大全
PostgreSQL是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL开发者把它念作post-gress-Q-L。PostgreSQL的Slogan是"世界上最先进的开源关系型数据库"。基本语法CREATEFUNCTION//声明创建函数ADD(INTEGER,INTEGER)//定义函数名称RETURNSINTEGER//定义函数返回值'//定义函数体'--使用函数。......
525 1
|
canal 缓存 SpringCloudAlibaba
Springcloud Alibaba 使用Canal将MySql数据实时同步到Elasticsearch
本篇文章在Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性-CSDN博客 基础上使用canal将mysql数据实时同步到Elasticsearch。
496 0
|
算法 C++
【算法】网络最大流问题,三次尝试以失败告终
开始 已多次看到“网络最大流问题”的字眼,一直不知道是什么,后来终于有一次打算仔细了解一下,期间我发现了一篇不错的博客:全面理解网络流中的最大流问题。在这篇博客的帮助下,我成功弄清楚了什么是网络流中的最大流问题,同时也明白了解决这个问题的基本思路。
476 0