我创建了一个加载到 sqlite3 并为我创建一堆表的 SQL 文件。在那个 sql 文件中,我尝试使用 pragma 强制执行 foreign_keys:
PRAGMA foreign_keys = on; -- also 1, true
当我使用它加载 sql 文件时,-init
它看起来不错:
$ 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
文件中设置此编译指示?还是来自环境变量?
请注意,我正在加载 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 杂注之外的所有东西都有效。我还尝试了其他地方找到的基于 URI 的方法:
sqlite3, err := sql.Open("sqlite3", "file:unit_test.db?foreign_keys=on")
它都不起作用或没有任何效果。如何设置 foreign_keys 杂注并使其保持不变?
编辑:重复上述内容,并将 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:我可以通过将编译指示添加到我的.sqliterc
文件中来让它“坚持”,但它是一个要求用户这样做的 PITA。难道没有别的办法了吗?也不太确定这将如何与 CI 一起工作......