gorm.DB可以自动解析外键吗?

时间:2018-01-17 22:35:55

标签: mysql database go orm go-gorm

我正在尝试使用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

然后:

  • 我必须进行2次DB调用
  • 我不使用gorm的外键映射功能(如果有的话)

2 个答案:

答案 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