2

我创建了一个加载到 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 一起工作......

4

1 回答 1

2

答案列在mattn 的 sqlite3 驱动程序页面上

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

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

于 2020-10-29T20:06:16.440 回答