我正在尝试使用https://github.com/jinzhu/gorm为我自动映射外键,但不管怎么说,我做错了或者库不能这样做而且我错了。
我有以下struct
s:
type Currency struct {
ID uint64 `gorm:"primary_key"`
CurrencyCode string `gorm:"size:3"`
}
type Rate struct {
ID uint64 `gorm:"primary_key"`
CurrencyID uint64
Currency Currency `gorm:"ForeignKey:CurrencyID"`
Price float64
}
以及以下SQL表格(已编辑,以便currency_code为唯一)
CREATE TABLE `rates` (
`id` serial PRIMARY KEY,
`currency_id` bigint unsigned NOT NULL,
`price` decimal(12,2) NOT NULL,
CONSTRAINT `fk_rate_currency`
FOREIGN KEY (currency_id) REFERENCES currencies(id)
);
CREATE TABLE `currencies` (
`id` serial PRIMARY KEY,
`currency_code` char(3) NOT NULL UNIQUE
);
现在我想当我做这样的事情时:
rate := Rate{
Currency: Currency{
CurrencyCode: "USD",
},
Price: 123,
}
db, _ := gorm.Open("mysql", ...)
db.Create(&rate)
然后"USD"
会自动映射到currency_id
,但会在"USD"
表格中为每个currencies
db.Create(&rate)
条目
我做错了还是图书馆?
修改
我知道我可以通过查询数据库中的货币ID
来实现curr := db.Currency{}
db.Where("currency_code = ?", "USD").First(&curr)
// use curr with proper ID
然后:
gorm
的外键映射功能(如果有的话)答案 0 :(得分:1)
在documentation中声明:
默认情况下,创建/更新记录时,GORM将保存其关联,如果关联具有主键,GORM将调用Update保存,否则将创建。
因此,当您想要映射到某个条目时,您必须将其与ID相关联,否则它将创建一个新记录。
在您的情况下,您可以使用currency_code
作为Currency
的 PRIMARY KEY (使用固定数量的字符使其更快,而不是varchar,如{{1} }})。
这将不再需要按ID搜索,它只会找到“USD”作为主键并使用它=>每种货币不再有多个记录。此外,如果有一种它没有的货币,它将在sql:"type:char(3);unique"
表中创建它。
此外,您可以删除Currency
struct标记,让GORM使用AutoMigrate创建自己的表,并使用适当的FK创建表:
gorm:"ForeignKey:CurrencyID"
答案 1 :(得分:0)
在最近发布的GORM 2.0中,只要您的GORM标签正确,外键就会自动添加到您的数据库中。您可以说AutoMigrate变得更聪明。
只需升级并使用新的进口商品
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="ToDo.css">
<title> My To-Do List </title>
</head>
<body>
<div>
<div id="div1">
<h2 id="h">My To-Do List</h2>
<div id="div2">
<input type="text" id="input" placeholder="Title..." >
<span onclick="myFunction()" class="button">Add</span>
</div>
</div>
</div>
<ul id="myUL">
</ul>
</body>
<script src="ToDo.js"></script>
</html>
PS:新版本有一些重大更改,请查看官方发行说明以获取更多信息https://gorm.io/docs/v2_release_note.html