首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日一库:GORM 外键使用

在 GORM 中使用外键涉及到在结构体定义中指定外键关系以及数据库迁移时的操作。...下面是一个使用 GORM 定义外键的示例: 假设你有两个相关的表,一个是 User 表,另一个是 Order 表,每个订单属于一个用户。...你想在 Order 表中添加一个外键,关联到 User 表的主键。...Order 模型中的 UserID 字段用来存储外键关系。 在迁移数据库表时,GORM 会根据模型的关联关系自动创建外键。在查询用户时,使用 Preload 方法来预加载关联的订单信息。...需要注意的是,不同的数据库可能对外键的处理方式有所不同。上述示例使用的是 SQLite 数据库,其他数据库可能需要稍微不同的配置。在实际应用中,你需要根据使用的数据库类型进行适当的配置。

1.2K20

多表间的关系-一对多-多对多-一对一-外键约束

多表间的关系-一对多-多对多-一对一-外键约束 1. 表关系概述 现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,用户和订单、订单和商品、学生和课程等等。...我们管1的一方,叫主表或1表. 我们管多个一方,叫从表或多表. 通常要在多的一方添加一个字段,用于存放主表主键的值,我们管这个字段叫外键字段....一对多 一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一对多建表原则: 在从表(多方)创建一个字段,指向主表(一方)的主键.我们把这个字段称之为外键. 3....多对多 多对多(m:n) 例如:老师和学生,学生和课程,用户和角色 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。 4....外键约束 5.1 什么是外键约束 一张表中的某个字段引用另一个表的主键 主表:约束别人 副表/从表:使用别人的数据,被别人约束 5.2 创建外键 新建表时增加外键:[CONSTRAINT] [外键约束名称

6.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    gorm jion查询映射(扫描scan)到新的自定义嵌套结构体struct,必须使用select规定字段,与xorm的jion对比

    关于gorm多表联合查询(left join)的小记_f95_sljz的博客-CSDN博客_gorm join gorm的文档对于我来讲比较难看懂,因为一直使用beego嘛。...gorm必须使用select将要查的字段映射,否则返回不了值。 而且,这种关联,不需要什么外键啊,关联啊啥的,奇怪。jion和关联是什么关系?——这种不算关联。...关联可能指的是建表结构体里指定的一些外键foreignKey之类的。自定义的结构体,是没法使用关联的。...注意: // 注释:Has Many一对多的外键、引用 // 1.默认外键是 模型的类型(type)加上其 主键(ID) 生成 ,如:UserID // 2.可以改变外键`gorm:"foreignKey...建立的表才能这样用,beego orm建立的表无效 // 注释:Has Many一对多的外键、引用 // 1.默认外键是 模型的类型(type)加上其 主键(ID) 生成 ,如:UserID // 2.

    1.8K10

    gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

    下面3个结构体是嵌套关系,3层嵌套(或是2层嵌套) 奇怪的是,官网对foreignkey的理解和实际使用不一致,比如https://blog.csdn.net/daimading/article/details...Find(&business).Error return business, err } 注意: // 注释:Has Many一对多的外键、引用 // 1.默认外键是 从表中的字段为 主表模型的类型(...// User 有多张 CreditCard,UserID 是外键 // type User struct {——主表 // gorm.Model // CreditCards []CreditCard...// } // type CreditCard struct {——从表 // gorm.Model // Number string // UserID uint——这个是默认外键(主表名...// type CreditCard struct { // gorm.Model // Number string // UserNumber string——外键,这个值等于User

    6.1K30

    Go结构体标签

    结构体标签是对结构体字段的额外信息标签。Tag是结构体在编译阶段关联到成员的元信息字符串,在运行的时候通过反射的机制读取出来。结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。...键值对之间使用一个空格分隔,具体的格式如下:`key1:"value1" key2:"value2" key3:"value3"...` // 键值对用空格分隔key会指定反射的解析方式包含 json...GORM 默认定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt,可以嵌套入自建结构体,tag名大小写不敏感,建议使用camelCase...表:标签名说明foreignKey指定当前模型的列作为连接表的外键references指定引用表的列名,其将被映射为连接表外键polymorphic指定多态类型,比如模型名polymorphicValue...指定多态值、默认表名many2many指定连接表表名joinForeignKey指定连接表的外键列名,其将被映射到当前表joinReferences指定连接表的外键列名,其将被映射到引用表constraint

    1.2K31

    Go web 教程

    遵循一些范式:比如著名的数据库设计三范式 允许少量冗余 细讲下来,无外乎:1。 数据库表设计 2。 数据库字段设计、类型设计 3。 数据表关系设计:1对1,1对多,多对多 1。...如果你知道真实场景,尽量约束字段所占的空间,比如:电话号码 11 位,比如:密码长度 不多于12位 外键设计 外键原本用来维护数据一致性,但真实使用场景并不会这么用,而是依靠业务判断,比如,将某条记录的主键当作某表的某个字段...1对1,1对多,多对多关系 1对1: 某表的字段是另一个表的主键 type Order struct{ base AccountId int64 } 1对多:某表的字段是另一个表的主键的集合...:使用第三张表维护多对多的关系 type Shop2Tags struct { TagsId int64 `xorm:"index"` ShopId int64 `xorm:"index...time.Time `gorm:"type:timestamp with time zone" json:"birthday"` Points sql.NullFloat64 } 另一个具体的操作是

    1.2K30

    gorm源码2 tag映射

    参考 理解reflect 通过reflect获取tag值 gorm外键使用 gorm指定外键和关联外键 目的 分析model_struct.go下的ModelStruct, StructField 和Relationship..."` Username string `gorm:"type:varchar(20)"` Kind string `gorm:"type:varchar(20)"`...StructField会保存那些映射的属性 StructField 那些带tag的属性(比如Id, Username等)会被映射至此 Relationship 与其它数据库表相关的东西由该结构体管理(比如外检...struct,则调用for _, subField := range scope.New(fieldValue).GetModelStruct().StructFields递归分析嵌套结构体,并遍历其属性(一般...gorm.Model会遍历至此): 处理子类的一些属性,比较重要的是"PRIMARY_KEY",会加入主键 如果是slice或struct类型,也会进行对应的处理 设置field.DBName: /

    1.9K20

    Go语言gorm框架MySQL实践

    gorm是一个使用Go语言编写的ORM框架。文档齐全,对开发者友好,支持主流数据库。...在之前使用Java语言的时候用过两种JDBC和mybatis,一种是本地操作数据库的一种是在Springboot项目中使用,两者使用习惯上都是基于MySQL语句,都是在操作层面把MySQL语句拼写完成。...drive.DB().SetMaxIdleConns(20) // 迁移 schema drive.AutoMigrate(&Funtester{}) //注意:AutoMigrate 会创建表,缺少的外键...time.Time DeletedAt *time.Time `sql:"index"` } select 下面演示一下select常用语法,这里分成了两个:一个偏基础,一个偏复杂(主要是多查询条件串联..., 241859).Delete(&Funtester{}) fmt.Println(db.RowsAffected) } 执行SQL 当然gorm也是支持直接执行SQL语句的,有一个特殊就是执行查询语句的时候需要解析查询结果

    2K20

    手把手,带你从零封装Gin框架(四):数据库初始化(GORM)

    前言 许多框架都会引入 ORM 模型来表示模型类和数据库表的映射关系,这一篇将使用 gorm[1] 作为 ORM 库,它遵循了 ActiveRecord(模型与数据库表一一对应) 模式,并且提供了强大的功能...) gorm 有一个默认的 logger[3] ,由于日志内容是输出到控制台的,我们需要自定义一个写入器,将默认logger.Writer 接口的实现切换为自定义的写入器,上一篇引入了 lumberjack...,将继续使用它。...(mysql.New(mysqlConfig), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, // 禁用自动创建外键约束...: true, // 禁用自动创建外键约束 Logger: getGormLogger(), // 使用自定义 Logger }); err !

    2.1K30

    盘点一下结构体标签在Go中的应用

    结构体标签 Go语言允许我们通过结构体字段标签给一个字段附加可以被反射获取的”元信息“,正好我们上篇文章实战演示Go反射的使用方法和应用场景中讲了Go语言反射使用方法相关的内容,对反射不清楚的可以先去再复习一下...结构体标签字符串的值是一个由空格分隔的 key:"value" 对列表,例如: type User struct { Name string `json:"name" xml:"name"` }...看了我们上一篇文章的同学,应该会知道,结构体字段类型相关的信息,在反射的世界里使用reflect.StructFiled这个类型表示的。...yaml: 由gopkg.in/yaml.v2 包使用,详见yaml.Marshal()。 gorm: 由gorm.io/gorm包使用,示例可以在GORM的文档中找到。...总结 这篇文章算是我们上一篇讲Go反射的一个实践方向的延伸介绍,如果你也想在自己的包里提供一些结构体标签键,让自己的包更易用些,除了看咱们这篇文章外,还可以去看看上面咱们介绍的几个类库,看它们的源码里是怎么应用的

    85110

    Go 数据存储篇(六):数据表之间的关联关系和关联查询

    1、关联关系简介 MySQL 之所以被称之为关系型数据库,是因为可以基于外键定义数据表之间的关联关系,日常开发常见的关联关系如下所示: 一对一:一张表的一条记录对应另一张表的一条记录,比如用户表与用户资料表...一对多:一张表的一条记录对应另一张表的多条记录,比如用户表与文章表、文章表与评论表 多对一:一张表的多条记录归属另一张表的一条记录(一对多的逆向操作) 多对多:一张表的多条记录归属另一张表的多条记录,...`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 这里我们创建了一个外键将...fmt.Println(mysqlPost.Comments[0].Post) } 我们在 Post 和 Comment 结构体中分别通过 Comments 切片(数组指针)和 Post 指针定义两者之间的一对多和多对一关联...我们可以通过 ORM 类来简化这个流程,目前 Go 语言中最流行的 ORM 实现非 GORM 莫属,下篇教程,学院君就来给大家介绍 GORM 的基本使用。 (全文完)

    3.2K20
    领券