为什么 Create() 在 golang GORM 中调用 Select 查询?
Why does Create() call Select query in golang GORM?
我刚刚发现每当调用 db.Create()
时,都会调用两个 sql 查询:insert
和 select
。特别是 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 目前的设计方式。
我刚刚发现每当调用 db.Create()
时,都会调用两个 sql 查询:insert
和 select
。特别是 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 目前的设计方式。