Как включить проверку внешнего ключа в SQLite с помощью Slick - PullRequest
2 голосов
/ 27 марта 2019

Я хочу включить проверку внешнего ключа в SQLite через Slick. Я использую Slick 3.3.0. Как мне это сделать?

В настоящее время я подключаюсь к SQLite через DatabaseConfig[SQLiteProfile], выполняя

 DatabaseConfig.forConfig(path = configKey, classLoader = getClass.getClassLoader)

Мой конфиг выглядит так:

{
  "dataSourceClass": "slick.jdbc.DatabaseUrlDataSource",
  "db": {
    "driver": "org.sqlite.JDBC",

    "properties": {
      "foreign_keys": true
    },
    "url": "jdbc:sqlite:/path/to/mydb.sqlite?foreign_keys=on"
  },
  "profile": "slick.jdbc.SQLiteProfile$"
}

Я попытался добавить ?foreign_keys=ON в конец моего URL JDBC. Я также пытался переместить объект properties из объекта db в корневой уровень.

Если я взаимодействую с базой данных напрямую через JDBC, я смогу заставить ее работать:

package test

import java.sql.DriverManager

object Main extends App {

  val connection = DriverManager.getConnection(
    "jdbc:sqlite:/path/to/mydb.sqlite?foreign_keys=on")
  val statement = connection.createStatement()

  // this line throws, because table_with_fk is a table
  // with foreign keys into a different table
  statement.executeUpdate(
    "insert into table_with_fk values (0, 0, 0, 0, 0, 0, 0, 0)")
}

1 Ответ

2 голосов
/ 02 апреля 2019

Согласно play Framework - SQLite: включить внешний ключ , SQLite требует, чтобы вы включили его на уровне соединения.И это согласуется с вашим примером (вы передаете опцию внешнего ключа getConnection)

Если вы используете пул подключений за кулисами, возможно, именно поэтому он не работает.Попробуйте отключить, как в примере конфигурации базы данных .

В качестве альтернативы попробуйте выполнить простой оператор SQL с командой pragma PRAGMA foreign_keys = ON перед выполнением запроса.

...