猿问

为什么在像 gorm 这样的 go libs 中使用结构中的 sql 标签?

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

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

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


MMMHUHU
浏览 153回答 2
2回答

qq_笑_17

我认为您指的是像gorm这样的 ORM 库在这种情况下,元数据像sql:"primary_key"或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"`}

幕布斯6054654

取决于您使用的包和您的用例。CRUD 就够了吗?几乎总是这样,除非包装上这样说,这通常是罕见但可能的。很少有包有时会在可能会引起错误的引擎盖下魔术。如果您知道这些行为,或者在您的代码中非常明确,您可能会避免它。索引标签主要允许您使用包的迁移工具将模型声明转换为 sql 查询(CREATE语句)。所以如果你总是想自己做这件事,那么你可能不需要费心添加这样的标签。但是如果你的包需要一个标签,你可能会发现自己有一个错误。例如,在 的情况下gorm,该Model方法将结构指针作为输入。如果这个 struct 有一个名为ID它的字段,它将它用作主键,也就是说,ID它的值为“4”,它会WHERE id=4自动添加一个。如果你的结构有ID,你甚至不需要添加一个primary_key标签,它仍然会被视为一个。当您同时拥有“非主键”ID字段和实际用作主键的另一个字段时,此行为可能会导致问题。另一个例子gorm是这个。一种可能的行为还可以是检查可空属性并在INSERT语句涉及NOT NULL字段时抛出错误NULL 价值。另一方面,向结构添加标签可以被认为是一种很好的做法,因为它在数据库中提供了其属性的上下文。
随时随地看视频慕课网APP

相关分类

Go
我要回答