我一直在从官方文档学习 GORM,当尝试使用 Create() 函数从地图创建记录时遇到了一些困惑。
官方文档展示了从地图创建记录的示例:
// Single insert
db.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
// Batch insert
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "jinzhu_1", "Age": 18},
{"Name": "jinzhu_2", "Age": 20},
})
但问题是——如果表没有定义主键 (PK),这种方法可以正常工作。但是,如果我定义了一个主键字段(例如user_id
),就会出错。据我所知,每个表都必须有一个主键才能进行规范化,那么为什么这种方法在没有主键的情况下也能正常工作呢?
如果表有主键,从 map 创建记录有什么有效的用例吗?在这种情况下,GORM 会自动处理主键吗?还是我遗漏了什么,导致它真的无法处理主键?
我还想知道文档中的示例是否真的写得很好,或者是否需要对带有主键的表进行修改。处理带有主键的表时,我应该使用结构体而不是映射吗?
请原谅,但我强烈建议阅读手册。
戈姆概况
假设您已经使用组合将gorm.Model
User
嵌入到如下内容中:你的效果
User
看起来像这样所以是的,默认情况下 gorm 会为您处理主键,您甚至可以轻松访问它的值,如 Create 中所述:
你的例子
我不明白你为什么要用
map[string]interface{}
。这没什么好理由。同样,根据批量插入的文档:可以翻译为
Go 语言的主要优势之一是其类型安全。有了
interface{}
,你就不用再担心类型安全了。正如Go 谚语所说:我强烈建议你仔细阅读所有这些,以及Effective Go