首页 > 解决方案 > 为什么 Create() 在 golang GORM 中调用 Select 查询?

问题描述

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

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

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

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

标签: go-gorm

解决方案


我想我知道为什么了。如果我错了,请纠正我。

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

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

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

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


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

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

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


推荐阅读