为什么Create()在golang GORM中调用Select查询?

时间:2019-06-10 16:22:28

标签: go-gorm

我刚刚发现每当我调用db.Create()时,就会有两个SQL查询:insertselect。特别是选择查询:

SELECT "num", "my_text", "my_int" FROM "product"  WHERE (id = 2)

(1)为什么调用选择查询?没有它,性能应该会更好。

(2)为什么选择这三列?该表中有18列。我发现这三列之间没有任何共同的关系。它们都是不同的类型。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我想我明白了原因。如果我错了,请纠正我。

例如,当我执行db.Create(&product)时,

(1)GORM会将数据库中未知的字段值加载到变量product中。

(2)之所以只选择三个字段,是因为我没有在原始product变量中提供这些值,并且GORM不知道这些值是什么,因此选择这些字段并然后将它们分配给product。例如,num是一个自动递增的序列。

(3)如果在创建行之前将所有字段的值提供给product,则GORM将不会在select之后调用insert


顺便说一句,GORM在这方面不是很聪明,因为my_text在定义中具有默认值,例如

MyText string `gorm:"default:'abc'"`

因此,即使我没有指定该字段,GORM也应该知道my_text的值是什么,并且不再需要选择它。但是,无论如何,这可能只是GORM目前的设计方式。