为什么在像 gorm 这样的 go 库中的结构中使用 sql 标签?
Why use sql tags in struct in some go libs like gorm?
好吧,我知道在 golang 中结构体中标签的必要性以及在 golang 中如何通过 reflect 访问它。但是我已经搜索过,但找不到可靠的答案来回答为什么我在为 sql 结果编写结构时应该在结构中使用 sql 标签的问题。我研究了许多示例代码,人们在结构中使用 sql:"index"
并在结构中使用 sql:"primary_key"
。
现在我在数据库层做了索引,还不够吗?我是否也必须使用 sql:"index"
才能获得最佳结果?像这样我在数据库中定义了主键属性我是否也必须指定 sql:"primary_key"
?
我的代码似乎没有这些也能正常工作。只是想知道它们的好处和用法。
我认为您指的是像 gorm
这样的 ORM 库
在那种情况下,像 sql:"primary_key"
或 sql:"index"
这样的元数据只会告诉 ORM 在尝试设置表或迁移它们时创建索引。
gorm 中的几个示例可能是:索引、主键、外键、多对多关系,或者当尝试将现有模式调整到您的 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"`
}
取决于您使用的包和您的用例。 CRUD 就够了吗?几乎总是如此,除非包装上如此说明,这通常很少见但可能发生。很少有软件包有时会在引擎盖下施展魔法,这可能会导致错误。如果您知道这些行为,或者在您的代码中非常明确,您可能会避免它。
索引标签主要允许您使用包的迁移工具将您的模型声明转换为 sql 查询(CREATE
语句)。所以如果你总是想自己做,那么你可能不需要费心添加这样的标签。
但是如果您的包裹需要标签,您可能会发现自己是一个错误。例如,在 gorm
的情况下,Model
方法将结构指针作为输入。如果这个结构有一个名为 ID
的字段,它将把它用作主键,也就是说,假设 ID
的值为“4”,它会自动添加一个 WHERE id=4
。如果您的结构有 ID
,您甚至不需要添加 primary_key
标记,它仍将被视为一个。当您同时拥有“非主键”ID
字段和您实际用作主键的另一个字段时,此行为可能会导致问题。 gorm
的另一个示例是 this。如果 INSERT
语句涉及 NOT NULL
字段获取 NULL
值,则可能的行为还可以是检查可空 属性 并抛出错误。
另一方面,将标签添加到您的结构可以被认为是一种很好的做法,因为它提供了它在数据库中的属性的上下文。
好吧,我知道在 golang 中结构体中标签的必要性以及在 golang 中如何通过 reflect 访问它。但是我已经搜索过,但找不到可靠的答案来回答为什么我在为 sql 结果编写结构时应该在结构中使用 sql 标签的问题。我研究了许多示例代码,人们在结构中使用 sql:"index"
并在结构中使用 sql:"primary_key"
。
现在我在数据库层做了索引,还不够吗?我是否也必须使用 sql:"index"
才能获得最佳结果?像这样我在数据库中定义了主键属性我是否也必须指定 sql:"primary_key"
?
我的代码似乎没有这些也能正常工作。只是想知道它们的好处和用法。
我认为您指的是像 gorm
这样的 ORM 库在那种情况下,像 sql:"primary_key"
或 sql:"index"
这样的元数据只会告诉 ORM 在尝试设置表或迁移它们时创建索引。
gorm 中的几个示例可能是:索引、主键、外键、多对多关系,或者当尝试将现有模式调整到您的 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"`
}
取决于您使用的包和您的用例。 CRUD 就够了吗?几乎总是如此,除非包装上如此说明,这通常很少见但可能发生。很少有软件包有时会在引擎盖下施展魔法,这可能会导致错误。如果您知道这些行为,或者在您的代码中非常明确,您可能会避免它。
索引标签主要允许您使用包的迁移工具将您的模型声明转换为 sql 查询(CREATE
语句)。所以如果你总是想自己做,那么你可能不需要费心添加这样的标签。
但是如果您的包裹需要标签,您可能会发现自己是一个错误。例如,在 gorm
的情况下,Model
方法将结构指针作为输入。如果这个结构有一个名为 ID
的字段,它将把它用作主键,也就是说,假设 ID
的值为“4”,它会自动添加一个 WHERE id=4
。如果您的结构有 ID
,您甚至不需要添加 primary_key
标记,它仍将被视为一个。当您同时拥有“非主键”ID
字段和您实际用作主键的另一个字段时,此行为可能会导致问题。 gorm
的另一个示例是 this。如果 INSERT
语句涉及 NOT NULL
字段获取 NULL
值,则可能的行为还可以是检查可空 属性 并抛出错误。
另一方面,将标签添加到您的结构可以被认为是一种很好的做法,因为它提供了它在数据库中的属性的上下文。