为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMMHUHU 2021-11-22 18:32:35
好吧,我知道 golang 中结构中标签的必要性以及如何通过 golang 中的反射来访问它。但是我已经搜索过,但找不到可靠的答案来回答为什么我应该在 struct 中使用 sql 标签而为 sql 结果编写 struct 的问题。我已经探索了许多示例代码,人们sql:"index"在结构和sql:"primary_key"结构中使用。现在我已经在数据库层做了索引,还不够吗?我是否也必须使用sql:"index"才能获得最佳效果?像这样我在数据库中定义了主键属性,我是否也必须指定sql:"primary_key"?如果没有这些,我的代码似乎可以正常工作。只是想知道它们的好处和用法。
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我认为您指的是像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"`

}


查看完整回答
反对 回复 2021-11-22
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

索引标签主要允许您使用包的迁移工具将模型声明转换为 sql 查询(CREATE语句)。所以如果你总是想自己做这件事,那么你可能不需要费心添加这样的标签。

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

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


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信