1 回答

TA貢獻1735條經驗 獲得超5個贊
我不認為遷移器工具會幫助你,因為它假設你將使用默認的Gorm模式來定義關系,并且你已經明確決定不使用這些模式。
剩下的唯一選擇是自己管理約束,要么通過SQL腳本,要么通過更簡單的,在調用旁邊運行的一些自定義查詢:AutoMigrate
import "gorm.io/gorm/clause"
// somewhere you must be calling
db.AutoMigrate(&Class{}, &Booking{})
// then you'd have:
constraint := "fk_booking_classid"
var count int64
err := db.Raw(
"SELECT count(*) FROM INFORMATION_SCHEMA.table_constraints WHERE constraint_schema = ? AND table_name = ? AND constraint_name = ?",
db.Migrator().CurrentDatabase(),
"bookings",
constraint,
).Scan(&count).Error
// handle error
if (count == 0) {
err := db.Exec(
"ALTER TABLE bookings ADD CONSTRAINT ? FOREIGN KEY class_id REFERENCES classes(id)",
clause.Table{Name: constraint},
).Error
// handle error
}
當然,這否定了自動遷移的優勢(這意味著當字段名稱等內容發生變化時,約束將在不更改遷移代碼的情況下更新)。
我會看看為什么你不想像gorm預期的那樣定義外鍵,因為這聞起來像你試圖直接使用數據庫模型作為JSON API請求/響應模型,這通常不會導致一個好的結束:)
- 1 回答
- 0 關注
- 214 瀏覽
添加回答
舉報