我刚刚发现每当我调用db.Create()
时,就会有两个SQL查询:insert
和select
。特别是选择查询:
SELECT "num", "my_text", "my_int" FROM "product" WHERE (id = 2)
(1)为什么调用选择查询?没有它,性能应该会更好。
(2)为什么选择这三列?该表中有18列。我发现这三列之间没有任何共同的关系。它们都是不同的类型。
非常感谢。
答案 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目前的设计方式。