gpt4 book ai didi

mysql - 外键和相关数据与 gorm

转载 作者:行者123 更新时间:2023-12-01 19:26:44 25 4
gpt4 key购买 nike

我正在使用 golang 和 gorm 与 MySQL 数据库交谈。
我有一个包含发布元数据的表:

type OSType string
const (
Windows OSType = "windows"
Mac OSType = "mac"
)

type AgentMetadata struct {
Version string `gorm:"primary_key"`
OS OSType `gorm:"primary_key" sql:"type:ENUM('windows','mac')"`
Name string `sql:"not null"`
Description string `sql:"not null"`
ReleaseNotesUrl string `sql:"not null"`

UpdateTime time.Time `sql:"DEFAULT:current_timestamp"`
}
版本由组合键标识 - 操作系统和版本(编号)。
我有另一个表,它定义了客户端应该下载的默认版本(通过操作系统):
type GlobalDefault struct {
OS OSType `gorm:"primary_key" sql:"type:ENUM('windows','mac')"`
Version string
AgentMetadata AgentMetadata

UpdateTime time.Time `sql:"DEFAULT:current_timestamp"`
}
我想要的是定义从 GlobalDefault 到 AgentMetadata(OS 和版本对)的两个外键,我希望能够通过其键 OS 查询 GlobalDefault 表并取回已经包含完整 AgentMetadata 的数据结构。
经过很长时间阅读大量文档、问题和代码示例后,我尝试执行以下操作:
func (repository *AgentRepository)GetGlobalDefault(os OSType) (error, AgentMetadata) {
gd := GlobalDefault{ OS:os }

result := AgentMetadata{}
return repository.connection.Find(&gd).Related(&result, "OS", "Version").Error, result
}
这在某种意义上“有效”,因为它确实用 AgentMetadata 填充了结果。但是,这不是正确的元数据。
在我的测试中,我添加了两个元数据记录和一个默认值:
enter image description here
enter image description here
当我调用 err, queryResult := ar.GetGlobalDefault(defaultAgent.OS)我得到了 1.2.3.1 元数据,而不是 1.2.3 版本的元数据。
事实上,当我打开 gorm 日志时,我看到它运行了查询:

[2017-07-15 17:51:50] [276.74ms] SELECT * FROM global_defaults WHERE global_defaults.os = 'windows'

[2017-07-15 17:51:50] [276.55ms] SELECT * FROM agent_metadata WHERE (os = 'windows')


首先,它忽略了我在 agent_metadata 表中有一个复合键的事实,其次,它没有使用连接进行单个查询,而是进行了两次查询(这确实是浪费时间)。
另一件困扰我的事情是我必须明确指定外键名称,而根据文档,似乎不需要指定它们,或者至少可以通过添加标签来实现:
type GlobalDefault struct {
OS OSType `gorm:"primary_key" sql:"type:ENUM('windows','mac')"`
Version string
AgentMetadata AgentMetadata `gorm:"ForeignKey:OS;AssociationForeignKey:OS"`

UpdateTime time.Time `sql:"DEFAULT:current_timestamp"`
}
在这里,我只为 OS 列添加了一个标记,但是,我尝试连接外键名称,但两个选项似乎都对结果没有影响。如果没有在 API 中明确指定外键名称,将不会读取相关数据。将名称传递给查询意味着我的数据库映射没有整合到一个地方,我不喜欢那样。
我的情况可以解决吗?我可以有一个复合外键吗?我可以在一个地方指定所有 ORM 属性吗?如何让 gorm 在数据库中创建外键(我注意到架构是在没有从 GlobalDefault 到 AgentMetadata 的外键的情况下创建的)?

最佳答案

How can I make gorm create foreign keys in the DB?


这是一个示例:
db.AutoMigrate(&model.User{}).
AddForeignKey("account_id", "accounts(id)", "CASCADE", "CASCADE").
AddForeignKey("role_id", "roles(id)", "RESTRICT", "RESTRICT")

关于mysql - 外键和相关数据与 gorm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45119583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com