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

时间:2015-11-21 18:28:18

标签: sql go go-gorm

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

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

如果没有这些,我的代码似乎工作正常。只是想知道他们的利益和用法。

2 个答案:

答案 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 字段,则可能的行为还可以是检查可空属性并抛出错误。

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