11

好吧,我知道 golang 结构中标签的必要性,以及 golang 中的反射如何访问它。但是我已经搜索并找不到可靠的答案来回答为什么在为 sql 结果编写 struct 时应该在 struct 中使用 sql 标签。我探索了许多示例代码,人们sql:"index"在结构和sql:"primary_key"结构中使用。

现在我已经在数据库层做了索引,还不够吗?我是否必须使用以sql:"index"获得最佳效果?像这样我已经在数据库中定义了主键属性,我也应该指定sql:"primary_key"吗?

没有这些,我的代码似乎可以正常工作。只想知道它们的好处和用途。

4

2 回答 2

8

我认为您指的是像gorm这样的 ORM 库

在这种情况下,像sql:"primary_key"or之类的元数据sql:"index"只会告诉 ORM 在尝试设置表或迁移它们时创建索引。

gorm中的几个示例可能是:索引、主键、外键、many2many 关系,或者在尝试将现有模式适应您的gorm模型时,显式设置类型,例如:

type Address struct {
    ID       int
    Address1 string         `sql:"not null;unique"` // Set field as not nullable and unique
    Address2 string         `sql:"type:varchar(100);unique"`
    Post     sql.NullString `sql:"not null"`
}
于 2015-11-21T20:21:19.350 回答
0

取决于您使用的包和您的用例。CRUD 够用吗?几乎总是,除非包装上这样说,这通常很少见,但可能。很少有软件包有时会在引擎盖下发挥作用,这可能会导致错误。如果您知道这些行为,或者在您的代码中非常明确,您可能会避免它。

索引标签主要允许您使用包的迁移工具将您的模型声明转换为 sql 查询(CREATE语句)。因此,如果您总是想自己执行此操作,那么您可能无需费心添加此类标签。

但是如果你的包需要一个标签,你可能会发现自己是一个错误。例如,在 的情况下gorm,该Model方法将结构指针作为输入。如果这个结构有一个名为ID它的字段,它将它用作主键,也就是说,ID它的值为“4”,它会WHERE id=4自动添加一个。如果您的 struct 有ID,您甚至不需要添加primary_key标签,它仍将被视为一个标签。当您同时拥有“非主键”ID字段和您实际用作主键的另一个字段时,此行为可能会导致问题。另一个例子gormthis。一个可能的行为也可能是检查可空属性并在INSERT语句涉及NOT NULL获取NULL价值。

另一方面,将标签添加到您的结构可以被认为是一种很好的做法,因为它提供了其在数据库中的属性的上下文。

于 2021-06-30T12:24:41.027 回答