最近在學(xué)習(xí)golang, 使用gin框架搭了個網(wǎng)站,于是在網(wǎng)上找golang的orm
找到gorm使用了兩天突然發(fā)現(xiàn)v2已經(jīng)發(fā)布了,看更新日志說提高了性能修復(fù)了很多bug,于是趕緊換了v2,以下紀(jì)錄我使用gorm v2 踩過的坑
我使用gorm連接的是mysql, 在使用automigrate根據(jù)關(guān)系模型創(chuàng)建表的時候總是創(chuàng)建失敗
首先看官方文檔,簡單的關(guān)聯(lián)關(guān)系,其實理解了官方案例問題就不大.
但是在復(fù)雜關(guān)系的時候創(chuàng)建就會報錯(無法添加外鍵約束等).這里我提供我自己實驗出的一種解決方式:
以我自己的項目為例,假設(shè)有User(用戶),House(房間),Order(訂單)三個表, 無關(guān)的屬性已經(jīng)去掉
<pre>type User struct {
gorm.Model // gorm自帶, 會提供ID, craeteAt, updateAt, deleteAt四個屬性
Property1 int
Property2 string
Houses []*House `gorm:"many2many:user_houses"` // 用戶與房間多對多的關(guān)系
Orders []Order // 用戶與訂單一對多的關(guān)系
}
type House struct {
gorm.Model
Property1 int
Property2 string
Tenants []*User `gorm:"many2many:user_houses;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type Order struct {
gorm.Model
Property1 int
Property2 string
UserID int
HouseID int
House </pre>
精簡了很多屬性和關(guān)聯(lián)不知道還會不會報錯.
創(chuàng)建的時候先屏蔽所有的外鍵關(guān)系然后創(chuàng)建表, 注釋之后如下
<pre>type User struct {
gorm.Model // gorm自帶, 會提供ID, craeteAt, updateAt, deleteAt四個屬性
Property1 int
Property2 string
// Houses []*House `gorm:"many2many:user_houses"` // 用戶與房間多對多的關(guān)系
// Orders []Order // 用戶與訂單一對多的關(guān)系
}
type House struct {
gorm.Model
Property1 int
Property2 string
// Tenants []*User `gorm:"many2many:user_houses;constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type Order struct {
gorm.Model
Property1 int
Property2 string
// UserID int
// HouseID int
// House </pre>
相當(dāng)于每個表都只剩下了gorm.Model和兩個Property,請注意在Order表中我注釋掉了UserID,HouseID
因為這兩個屬性雖然是基礎(chǔ)類型屬性,但是UserID是user表的外鍵, HouseID是下面House表的外鍵, 所以說這兩個屬性也要注釋掉
然后你就可以執(zhí)行db.AutoMigrate(&User{},&House{},&Order{}) 來自動遷移創(chuàng)建你的表;
創(chuàng)建完成之后放開User表的Houses和House表的Tenants, 然后再次執(zhí)行自動遷移, 就可以創(chuàng)建users表和houses表的多對多關(guān)聯(lián)表;
然后再放開Order的HouseID 和House, 就可以創(chuàng)建orders表對houses表的一對一關(guān)系約束;
最后放開User的Orders和Order的UserID, 就可以創(chuàng)建users表對orders表的一對多關(guān)系約束;
這樣分步創(chuàng)建就不會報錯,如果報錯的話請檢查你的模型是否有問題, 多參考官方給出的案例
還有官網(wǎng)給出的項目gin-vue-admin也可以參考