在 GORM SQLite 中强制执行外键约束

bar*_*rjo 6 sqlite foreign-keys go go-gorm

答案:用于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
}
Run Code Online (Sandbox Code Playgroud)

这正确地创建了一个外键约束,其中owner_id引用idowners. 这可以通过.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`));
Run Code Online (Sandbox Code Playgroud)

我尝试过PRAGMA foreign_keys = ON;在 SQLite shell 中运行命令时强制执行外键。如果我尝试将 an 更新owner_idid中不存在的an owners,我会得到:Error: FOREIGN KEY constraint failed,这是我想要的行为,但是,GORM 仍然能够执行这些更新而不会收到此错误。

out*_*ead 7

PRAGMA foreign_keys您需要在更新之前执行查询以打开

if res := db.Exec("PRAGMA foreign_keys = ON", nil); res.Error != nil {
    return res.Error
}
Run Code Online (Sandbox Code Playgroud)

  • 啊非常感谢你。正是 `db.Exec("PRAGMAforeign_keys = ON", nil)` 为我解决了这个问题。不需要 `gorm` 结构标签,因为外键约束是由 Gorm 通过简单地引用 `Owner` 作为类型 `Owner` 来创建的 (2认同)