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 关注
- 190 浏览
添加回答
举报