GORM设置primaryKey标签后数据库无主键字段问题咨询
GORM模型主键未生成问题及关联关系说明
问题描述
我是Golang初学者,在使用gorm:"primaryKey"标签定义模型后,发现数据库中并未出现对应的主键字段。我的模型代码如下:
type Orders struct { OrderID uint64 `gorm:"primaryKey" json:"orderId"` CustomerName string `json:"customerName"` OrderedAt time.Time `json:"orderedAt" example:"2020-01-09T21:21:46+00:00"` Items []Items `json:"items"` } type Items struct { ItemID uint64 `gorm:"primaryKey" json:"lineItemId"` Item_code string `json:"itemCode"` Description string `json:"description"` Quantity int `json:"quantity"` }
请问我哪里出错了?另外Items字段是否需要使用关系型数据库?
问题解答
一、主键字段未生成的原因及解决方法
未执行GORM自动迁移
GORM不会自动创建表和字段,必须显式调用自动迁移方法。在数据库连接初始化后需要执行:err := db.AutoMigrate(&Orders{}, &Items{}) if err != nil { // 处理迁移错误 }不执行这一步,数据库中不会生成对应的表和主键字段。
结构体字段不可导出
你的OrderID和ItemID首字母大写,符合导出要求,但Items结构体中的Item_code是小写开头,Go中首字母小写的结构体字段属于包内私有,GORM无法通过反射识别,所以这个字段也不会在数据库中生成。建议改为ItemCode,如果需要数据库列名为item_code,可以补充标签:ItemCode string `gorm:"column:item_code" json:"itemCode"`数据库连接配置错误
检查数据库连接参数,确认是否连接到了预期的数据库实例,避免因连接到错误的库而看不到生成的表和字段。
二、关于Items字段与关系型数据库的使用
你的Orders结构体中Items []Items表示一对多关系(一个订单对应多个商品条目),这种场景非常适合使用关系型数据库——关系型数据库原生支持外键约束,能很好地维护关联数据的一致性。
要让GORM正确处理这个关联,需要修改模型添加外键:
type Items struct { ItemID uint64 `gorm:"primaryKey" json:"lineItemId"` OrderID uint64 `json:"orderId"` // 新增外键,关联Orders的OrderID ItemCode string `gorm:"column:item_code" json:"itemCode"` Description string `json:"description"` Quantity int `json:"quantity"` } type Orders struct { OrderID uint64 `gorm:"primaryKey" json:"orderId"` CustomerName string `json:"customerName"` OrderedAt time.Time `json:"orderedAt" example:"2020-01-09T21:21:46+00:00"` Items []Items `gorm:"foreignKey:OrderID" json:"items"` // 指定外键关联规则 }
执行自动迁移后,GORM会在items表中生成order_id外键字段,并建立与orders表的关联约束。
内容的提问来源于stack exchange,提问作者Alfin
相关产品推荐
相关产品推荐

