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