【问题标题】:Why use sql tags in struct in some go libs like gorm?为什么在 gorm 等 go 库中的 struct 中使用 sql 标签?
【发布时间】:2015-11-21 18:28:18
【问题描述】:

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

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

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

【问题讨论】:

  • 你在哪里看到这个示例代码?
  • 大部分 ORM 都在使用它。以他们自己的方式主要是 Gorm

标签: sql go go-gorm


【解决方案1】:

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

【讨论】:

  • 此外,对于许多非 ORM 库(例如 sqlx),结构标签用于将列名映射到结构字段 - 例如源中的EmailAddress 到数据库中的email_address
  • 在具有 gorm 和默认值的 auto_increment 唯一 ID 字段方面存在问题。平原只是不能插入一行。
  • 你为什么链接到一些fork而不是github.com/go-gorm/gorm?这看起来很可疑。
  • @TheDiveO 感谢您对此发表评论。我正在更新链接。作为可能正在阅读本文的随机读者的上下文:在 go-gorm 迁移到它自己的存储库之前,它托管在 Jinzhu 的组织下。 Jinzhu 是 go-gorm 和 github.com/jinzhu/nowgithub.com/jinzhu/copiergithub.com/jinzhu/configor 等其他几个 go 库的原作者。
【解决方案2】:

取决于您使用的包和您的用例。 CRUD 够用吗?几乎总是,除非包装上这样说,这通常很少见,但可能。很少有软件包有时会在引擎盖下发挥作用,这可能会导致错误。如果您意识到这些行为,或者在您的代码中非常明确,您可能会避免它。

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

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

另一方面,将标签添加到您的结构被认为是一种很好的做法,因为它提供了其在 DB 中的属性的上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2023-03-15
    • 2012-11-21
    相关资源
    最近更新 更多