在 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
}