在 GORM SQLite 中强制执行外键约束
Enforce foreign key constraints in GORM SQLite
答案:使用db.Exec("PRAGMA foreign_keys = ON")
强制执行外键约束检查。谢谢@outdead
当我使用 GORM 更新我的 SQLite 数据库时,没有强制执行外键约束。
我有这两个型号:
type Cat struct {
ID int
Name string
Breed string
OwnerID int
Owner Owner
}
type Owner struct {
ID int
Name string
Phone string
}
这正确地创建了外键约束,其中 owner_id
引用了 owners
中的 id
。这可以通过 运行ning: .schema cats
在 SQLite shell:
中验证
CREATE TABLE `cats` (`id` integer,`name` text,`breed` text,`owner_id` integer,PRIMARY KEY (`id`),CONSTRAINT `fk_cats_owner` FOREIGN KEY (`owner_id`) REFERENCES `owners`(`id`));
我已经尝试 PRAGMA foreign_keys = ON;
当我在 SQLite shell 中执行 运行 命令时强制执行外键。如果我尝试将 owner_id
更新为 owners
中不存在的 id
,我会得到:Error: FOREIGN KEY constraint failed
,这是我想要的行为,但是,GORM仍然能够执行这些更新而不会收到此错误。
更新前需要执行查询开启PRAGMA foreign_keys
if res := db.Exec("PRAGMA foreign_keys = ON", nil); res.Error != nil {
return res.Error
}
答案:使用db.Exec("PRAGMA foreign_keys = ON")
强制执行外键约束检查。谢谢@outdead
当我使用 GORM 更新我的 SQLite 数据库时,没有强制执行外键约束。
我有这两个型号:
type Cat struct {
ID int
Name string
Breed string
OwnerID int
Owner Owner
}
type Owner struct {
ID int
Name string
Phone string
}
这正确地创建了外键约束,其中 owner_id
引用了 owners
中的 id
。这可以通过 运行ning: .schema cats
在 SQLite shell:
CREATE TABLE `cats` (`id` integer,`name` text,`breed` text,`owner_id` integer,PRIMARY KEY (`id`),CONSTRAINT `fk_cats_owner` FOREIGN KEY (`owner_id`) REFERENCES `owners`(`id`));
我已经尝试 PRAGMA foreign_keys = ON;
当我在 SQLite shell 中执行 运行 命令时强制执行外键。如果我尝试将 owner_id
更新为 owners
中不存在的 id
,我会得到:Error: FOREIGN KEY constraint failed
,这是我想要的行为,但是,GORM仍然能够执行这些更新而不会收到此错误。
更新前需要执行查询开启PRAGMA foreign_keys
if res := db.Exec("PRAGMA foreign_keys = ON", nil); res.Error != nil {
return res.Error
}