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

Why does Create() call Select query in golang GORM?

我刚刚发现每当调用 db.Create() 时,都会调用两个 sql 查询:insertselect。特别是 select 查询:

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

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

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

我想我明白了原因。如有错误请指正

例如,当我做 db.Create(&product)

(1) GORM 将从数据库加载它不知道的字段值到变量 product.

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

(3) 如果我在创建行之前将所有字段的值提供给 product,GORM 将不会在 insert.

之后调用 select

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

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

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