Omo*_*tis 4 sqlite go go-sqlite3
我创建了一个 SQL 文件,该文件加载到 sqlite3 中并为我创建了一堆表。在该 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 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:我可以通过将编译指示添加到我的.sqliterc文件中来使其“粘住”,但要求用户这样做是一个 PITA。难道就没有别的办法了吗?也不太确定这将如何与 CI 一起工作......
答案列在mattn 的 sqlite3 驱动程序页面上:
    sqlite3, err := sql.Open("sqlite3", "file:unit_test.db?_foreign_keys=on")
我在上面很接近,只是没有下划线...谢谢@shawn...
| 归档时间: | 
 | 
| 查看次数: | 1503 次 | 
| 最近记录: |