sqlite3 в golang, прагма foreign_keys не применяет ключи

Я создал файл SQL, который загружается в sqlite3 и создает для меня кучу таблиц. В этом sql-файле я пытаюсь принудительно применить 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 и заставить ее закрепиться?

Изменить: отбросив вышеизложенное и оставив голанг вне его:

$ 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...

1 ответ

Ответ указан на странице драйвера mattn sqlite3:

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

Я был близко кверху, просто не было подчеркивания... Спасибо @shawn...

Другие вопросы по тегам