gpt4 book ai didi

golang 中的 sqlite3,foreign_keys pragma 不强制键

转载 作者:行者123 更新时间:2023-12-05 02:48:18 25 4
gpt4 key购买 nike

我创建了一个 SQL 文件,它加载到 sqlite3 中并为我创建了一堆表。在该 sql 文件中,我尝试使用 pragma 强制执行 foreign_keys:

PRAGMA foreign_keys = on; -- also 1, true

当我使用 -init 加载 sql 文件时,它看起来不错:

$ sqlite3 -init sqlite3-empty.sql
-- Loading resources from sqlite3-empty.sql
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> pragma foreign_keys;
1
sqlite> .quit

但是,如果我加载由上面的 sql 文件创建的数据库文件,它不会粘住:

$ sqlite3 unit_test.db
-- Loading resources from /home/me/.sqliterc
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> pragma foreign_keys;
foreign_keys
------------
0
sqlite> .quit
$ cat ~/.sqliterc
.headers on
.mode column

是否可以在我的 .sqliterc 文件中设置此 pragma?还是来自环境变量?

请注意,我正在加载 sql 创建脚本作为 go 单元测试设备设置的一部分:

    sqlite3, err := sql.Open("sqlite3", "unit_test.db")
if err != nil {
err = fmt.Errorf("NewSQLite3() error creating db connection: %w", err)
return nil, err
}
[...]
file, err := ioutil.ReadFile("sqlite3-empty.sql")
if err != nil {
err = fmt.Errorf("NewSQLite3() error opening seed file: %w", err)
return nil, err
}
requests := strings.Split(string(file), ";")

for _, request := range requests {
_, err := db.Client.Exec(request)
if err != nil {
err = fmt.Errorf("NewSQLite3() error executing seed file sql line: %v\n", err)
return nil, err
}
}

架构设置正确。除了 foreign_keys pragma 之外的所有东西都有效。我也尝试过在别处找到的基于 URI 的方法:

sqlite3, err := sql.Open("sqlite3", "file:unit_test.db?foreign_keys=on")

它们都不起作用或没有任何效果。如何设置 foreign_keys pragma 并使其保持不变?

编辑:重复以上内容,将 golang 排除在外:

$ sqlite3 -init sqlite3-empty.sql
-- Loading resources from sqlite3-empty.sql
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> pragma foreign_keys;
1
sqlite> .backup backup.db
sqlite> .quit
$ sqlite3 backup.db
-- Loading resources from /home/johnnyb/.sqliterc
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> pragma foreign_keys;
foreign_keys
------------
0
sqlite>

编辑 #2:我可以通过将 pragma 添加到我的 .sqliterc 文件来让它“坚持”,但要求用户这样做是一个 PITA。没有别的办法吗?也不太确定这将如何与 CI 一起工作......

最佳答案

答案列在 mattn's sqlite3 driver page 上:

    sqlite3, err := sql.Open("sqlite3", "file:unit_test.db?_foreign_keys=on")

我在上面很近,只是没有下划线...谢谢@shawn...

关于golang 中的 sqlite3,foreign_keys pragma 不强制键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64597611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com