我知道golang中struct的标签的必要性以及如何通过golang中的reflect来访问它。但是我已经搜索过了,并且在为sql结果编写struct时为什么我应该在struct中使用sql标签的问题找不到可靠的答案。我已经探索了许多示例代码,人们在结构中使用sql:"index"
,在结构中使用sql:"primary_key"
。
现在我已经在数据库层完成了索引,这还不够吗?我是否必须使用sql:"index"
才能获得最佳效果?像我这样在数据库中定义了主键属性我是否还必须指定sql:"primary_key"
?
如果没有这些,我的代码似乎工作正常。只是想知道他们的利益和用法。
答案 0 :(得分: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"`
}
答案 1 :(得分:0)
取决于您使用的包和您的用例。 CRUD 就够了吗?几乎总是这样,除非包装上这样说,这通常是罕见但可能的。很少有包有时会在引擎盖下进行魔术,这可能会引起错误。如果您知道这些行为,或者在您的代码中非常明确,您可能会避免它。
索引标签主要允许您使用包的迁移工具将模型声明转换为 sql 查询(CREATE
语句)。所以如果你总是想自己做这件事,那么你可能不需要费心添加这样的标签。
但是如果你的包需要一个标签,你可能会发现自己有一个错误。例如,在 gorm
的情况下,Model
方法将结构指针作为输入。如果此结构体有一个名为 ID
的字段,它会将其用作主键,即 ID
的值为“4”,它会自动添加一个 WHERE id=4
。如果您的结构具有 ID
,您甚至不需要添加 primary_key
标签,它仍然会被视为一个。当您同时拥有“非主键”ID
字段和实际用作主键的另一个字段时,此行为可能会导致问题。 gorm
的另一个示例是 this。如果 INSERT
语句涉及获取 NOT NULL
值的 NULL
字段,则可能的行为还可以是检查可空属性并抛出错误。
另一方面,向结构中添加标签可以被认为是一种很好的做法,因为它在数据库中提供了其属性的上下文。