golang gorm模型结构体的定义示例

目录
  • 1. 模型
    • 1.1. 模型定义
  • 2. 约定
    • 2.1. gorm.Model 结构体
    • 2.2. 表名是结构体名称的复数形式
    • 2.3. 更改默认表名
    • 2.4. 列名是字段名的蛇形小写
    • 2.5. 字段ID为主键
    • 2.6. 字段CreatedAt用于存储记录的创建时间
    • 2.7. 字段UpdatedAt用于存储记录的修改时间
    • 2.8. 字段DeletedAt用于存储记录的删除时间,如果字段存在

1. 模型

1.1. 模型定义

type User struct {
    gorm.Model
    Birthday     time.Time
    Age          int
    Name         string  `gorm:"size:255"`       // string默认长度为255, 使用这种tag重设。
    Num          int     `gorm:"AUTO_INCREMENT"` // 自增
    CreditCard        CreditCard      // One-To-One (拥有一个 - CreditCard表的UserID作外键)
    Emails            []Email         // One-To-Many (拥有多个 - Email表的UserID作外键
    BillingAddress    Address         // One-To-One (属于 - 本表的BillingAddressID作外键)
    BillingAddressID  sql.NullInt64
    ShippingAddress   Address         // One-To-One (属于 - 本表的ShippingAddressID作外键)
    ShippingAddressID int
    IgnoreMe          int `gorm:"-"`   // 忽略这个字段
    Languages         []Language `gorm:"many2many:user_languages;"` // Many-To-Many , 'user_languages'是连接表
}
type Email struct {
    ID      int
    UserID  int     `gorm:"index"` // 外键 (属于), tag `index`是为该列创建索引
    Email   string  `gorm:"type:varchar(100);unique_index"` // `type`设置sql类型, `unique_index` 为该列设置唯一索引
    Subscribed bool
}
type Address struct {
    ID       int
    Address1 string         `gorm:"not null;unique"` // 设置字段为非空并唯一
    Address2 string         `gorm:"type:varchar(100);unique"`
    Post     sql.NullString `gorm:"not null"`
}
type Language struct {
    ID   int
    Name string `gorm:"index:idx_name_code"` // 创建索引并命名,如果找到其他相同名称的索引则创建组合索引
    Code string `gorm:"index:idx_name_code"` // `unique_index` also works
}
type CreditCard struct {
    gorm.Model
    UserID  uint
    Number  string
}

2. 约定

2.1. gorm.Model 结构体

基本模型定义gorm.Model,包括字段IDCreatedAtUpdatedAtDeletedAt,你可以将它嵌入你的模型,或者只写你想要的字段

// 基本模型的定义
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}
// 添加字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`
type User struct {
  gorm.Model
  Name string
}
// 只需要字段 `ID`, `CreatedAt`
type User struct {
  ID        uint
  CreatedAt time.Time
  Name      string
}

2.2. 表名是结构体名称的复数形式

type User struct {} // 默认表名是`users`
// 设置User的表名为`profiles`
func (User) TableName() string {
  return "profiles"
}
func (u User) TableName() string {
    if u.Role == "admin" {
        return "admin_users"
    } else {
        return "users"
    }
}
// 全局禁用表名复数
db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响

2.3. 更改默认表名

您可以通过定义DefaultTableNameHandler对默认表名应用任何规则。

gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string  {
    return "prefix_" + defaultTableName;
}

2.4. 列名是字段名的蛇形小写

type User struct {
  ID uint             // 列名为 `id`
  Name string         // 列名为 `name`
  Birthday time.Time  // 列名为 `birthday`
  CreatedAt time.Time // 列名为 `created_at`
}
// 重设列名
type Animal struct {
    AnimalId    int64     `gorm:"column:beast_id"`         // 设置列名为`beast_id`
    Birthday    time.Time `gorm:"column:day_of_the_beast"` // 设置列名为`day_of_the_beast`
    Age         int64     `gorm:"column:age_of_the_beast"` // 设置列名为`age_of_the_beast`
}

2.5. 字段ID为主键

type User struct {
  ID   uint  // 字段`ID`为默认主键
  Name string
}
// 使用tag`primary_key`用来设置主键
type Animal struct {
  AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键
  Name     string
  Age      int64
}

2.6. 字段CreatedAt用于存储记录的创建时间

创建具有CreatedAt字段的记录将被设置为当前时间

db.Create(&user) // 将会设置`CreatedAt`为当前时间
// 要更改它的值, 你需要使用`Update`
db.Model(&user).Update("CreatedAt", time.Now())

2.7. 字段UpdatedAt用于存储记录的修改时间

保存具有UpdatedAt字段的记录将被设置为当前时间

db.Save(&user) // 将会设置`UpdatedAt`为当前时间
db.Model(&user).Update("name", "jinzhu") // 将会设置`UpdatedAt`为当前时间

2.8. 字段DeletedAt用于存储记录的删除时间,如果字段存在

删除具有DeletedAt字段的记录,它不会冲数据库中删除,但只将字段DeletedAt设置为当前时间,并在查询时无法找到记录,请参阅[软删除]

以上就是golang gorm模型结构体的定义示例的详细内容,更多关于golang gorm模型结构体的资料请关注我们其它相关文章!

(0)

相关推荐

  • golang gorm 操作mysql及gorm基本用法

    golang 官方的那个操作mysql的有点麻烦所以就使用了gorm,下面就gorm的使用做下简单介绍 下载gorm: go get -u github.com/jinzhu/gorm 在项目中引入gorm: import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) 定义db连接信息 func DbConn(MyUser, Password, Host, Db stri

  • golang gorm开发架构及写插件示例

    目录 1. 开发 1.1. 架构 1.2. 写插件 1.2.1. 注册新的callback 1.2.2. 删除现有的callback 1.2.3. 替换现有的callback 1.2.4. 注册callback顺序 1.2.5. 预定义回调 1. 开发 1.1. 架构 Gorm使用可链接的API,*gorm.DB是链的桥梁,对于每个链API,它将创建一个新的关系. db, err := gorm.Open("postgres", "user=gorm dbname=gorm

  • golang gorm框架数据库的连接操作示例

    目录 1. 连接数据库 1.1 MySQL 1.2 PostgreSQL 1.3 Sqlite3 1.4 不支持的数据库 2. 迁移 2.1. 自动迁移 2.2. 检查表是否存在 2.3. 创建表 2.4. 删除表 2.5. 修改列 2.6. 删除列 2.7. 添加外键 2.8. 索引 1. 连接数据库 要连接到数据库首先要导入驱动程序.例如 import _ "github.com/go-sql-driver/mysql" 为了方便记住导入路径,GORM包装了一些驱动. import

  • golang gorm的预加载及软删硬删的数据操作示例

    目录 1. orm读写数据 1. 创建 1.1. 创建记录 1.2. 默认值 1.3. 在Callbacks中设置主键 1.4. 扩展创建选项 2. 查询 2.1. Where查询条件 (简单SQL) 2.2. Where查询条件 (Struct & Map) 2.3. Not条件查询 2.4. 带内联条件的查询 2.5. Or条件查询 2.6. 查询链 2.7. 扩展查询选项 2.8. FirstOrInit 2.9. Attrs 2.10. Assign 2.11. FirstOrCreat

  • golang gorm错误处理事务以及日志用法示例

    目录 1. 高级用法 1.1. 错误处理 1.2. 事物 1.2.1. 一个具体的例子 1.3. SQL构建 1.3.1. 执行原生SQL 1.3.2. sql.Row & sql.Rows 1.3.3. 迭代中使用sql.Rows的Scan 1.4. 通用数据库接口sql.DB 1.4.1. 连接池 1.5. 复合主键 1.6. 日志 1.6.1. 自定义日志 1. 高级用法 1.1. 错误处理 执行任何操作后,如果发生任何错误,GORM将其设置为*DB的Error字段 if err := d

  • golang gorm的关系关联实现示例

    目录 1. 关联 1.1. 属于 1.2. 包含一个 1.3. 包含多个 1.4. 多对多 1.5. 多种包含 1.6. 关联模式 1. 关联 1.1. 属于 // `User`属于`Profile`, `ProfileID`为外键 type User struct { gorm.Model Profile Profile ProfileID int } type Profile struct { gorm.Model Name string } db.Model(&user).Related(

  • golang gorm的Callbacks事务回滚对象操作示例

    目录 1. Callbacks 1.1. 创建对象 1.2. 更新对象 1.3. 删除对象 1.4. 查询对象 1.5. 回调示例 1. Callbacks 您可以将回调方法定义为模型结构的指针,在创建,更新,查询,删除时将被调用,如果任何回调返回错误,gorm将停止未来操作并回滚所有更改. 1.1. 创建对象 创建过程中可用的回调 // begin transaction 开始事物 BeforeSave BeforeCreate // save before associations 保存前关

  • golang gorm模型结构体的定义示例

    目录 1. 模型 1.1. 模型定义 2. 约定 2.1. gorm.Model 结构体 2.2. 表名是结构体名称的复数形式 2.3. 更改默认表名 2.4. 列名是字段名的蛇形小写 2.5. 字段ID为主键 2.6. 字段CreatedAt用于存储记录的创建时间 2.7. 字段UpdatedAt用于存储记录的修改时间 2.8. 字段DeletedAt用于存储记录的删除时间,如果字段存在 1. 模型 1.1. 模型定义 type User struct { gorm.Model Birthda

  • go语言通过结构体生成json示例解析

    目录 通过结构体生成json 通过map生成json json解析到结构体 json解析到map 通过结构体生成json buf, err := json.MarshalIndent(s, "", " ") //格式化编码 package main import ( "encoding/json" "fmt" ) //成员变量名首字母必须大写 type IT struct { Company string `json:&quo

  • go语言结构体指针操作示例详解

    目录 指针 go指针操作 不能操作不合法指向 new函数 指针做函数的参数 数组指针 结构体指针变量 结构体成员普通变量 结构体成员指针变量 结构体比较和赋值 结构体作为函数参数 指针 指针是代表某个内存地址的值.内存地址储存另一个变量的值. 指针(地址),一旦定义了不可改变,指针指向的值可以改变 go指针操作 1.默认值nil,没有NULL常量 2.操作符“&”取变量地址,“*“通过指针(地址)访问目标对象(指向值) 3.不支持指针运算,不支持“->”(箭头)运算符,直接用“.”访问目标成

  • GO语言结构体面向对象操作示例

    目录 匿名字段初始化 成员的操作 同名字段 非结构体匿名字段 结构体指针类型匿名字段 面向过程和对象函数的区别 为结构体类型添加方法 指针变量方法集 普通变量方法集 方法的继承 方法的重写 方法值 方法表达式 匿名字段初始化 package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 } type Student struct { Person //只有类型,没有名

  • C++结构体字节对齐示例

    目录 示例代码 不想让结构体自动对齐怎么办 示例代码 #include <iostream> //输入输出流 using namespace std; #include <vector> //容器 struct MyStruct { unsigned char start1; unsigned char start2; unsigned char test1[7]; }; struct header { unsigned char by; //1字节 unsigned int dw

  • 解析结构体的定义及使用详解

    结构的定义 定义一个结构的一般形式为: struct 结构名 { 成员表列 }成员表由若干个成员组成,每个成员都是该结构的一个组成部分.对每个成员也必须作类型说明. 例如: 复制代码 代码如下: struct stu { int num; char name[20]; int age; } 结构类型变量的说明结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,它可以和语言本身所自有的简单数据类型一样使用(如 int ).结构体本身并不会被作为数据而开辟内存,真正作为数据而在

  • golang中按照结构体的某个字段排序实例代码

    目录 概述 从大到小排序 按照结构体的某个字段排序 使用 sort.Stable 进行稳定排序 附:根据结构体中任意字段进行排序 总结 概述 golang的sort包默认支持int, float64, string的从小大到排序: int -> Ints(x []int)float64 -> Float64s(x []float64)string -> Strings(x []string) 同时它还提供了自定义的排序接口Interface,此接口保护三个方法. type Interfa

  • Rust结构体的定义与实例化详细讲解

    结构体和我们在“元组类型”部分论过的元组类似,它们都包含多个相关的值.和元组一样,结构体的每一部分可以是不同类型.但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义.由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值. 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字.结构体的名字需要描述它所组合的数据的意义.接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field).结构体类似于Java中的实体. 一个存储用户账号信息

  • Golang打印复杂结构体两种方法详解

    目录 fmt结构体占位符 打印复杂结构体 方案一 方案二 fmt结构体占位符 在Golang中有原生的 fmt 格式化工具去打印结构体,可以通过占位符%v.%+v.%#v去实现,这3种的区别如下所示: type User struct { Name string Age int } func main() { user := User{ Name: "张三", Age: 95, } fmt.Printf("%v\n", user) fmt.Printf("

随机推荐