【问题标题】:How to enable foreign key validation in SQLite with Slick如何使用 Slick 在 SQLite 中启用外键验证
【发布时间】:2019-08-18 07:43:55
【问题描述】:

我想通过 Slick 在 SQLite 中启用外键验证。我正在使用 Slick 3.3.0。我该怎么做?

目前我正在通过 DatabaseConfig[SQLiteProfile] 连接到 SQLite,具体做法是

 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 添加到我的 JDBC URL 的末尾。我还尝试将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)")
}

【问题讨论】:

    标签: scala sqlite slick


    【解决方案1】:

    根据play framework - SQLite: Enable Foreign Key,SQLite 要求您在连接级别启用此功能。这与您的示例一致(您将外键选项传递给getConnection

    如果您在幕后使用连接池,也许这就是它不起作用的原因。尝试在database config example 中禁用。

    在运行查询之前,也可以使用编译指示命令PRAGMA foreign_keys = ON 尝试running a plain SQL statement

    【讨论】:

    • 最后一个代码 sn-p 不是我在我的应用程序中尝试过的,它是我为了展示我所做工作而制作的,虽然不是以某种方式这满足了我的需要。你知道我如何将一个普通的 SQL 语句与一个编译的 Slick 查询结合起来吗?我试过了,但不明白。
    • @torkel 这两个操作的结果都是DBIOAction,它是一个单子。您可以尝试使用 flatMap 将操作链接在一起,例如在 for 理解或 >> 运算符中,它会丢弃第一个值的结果。
    • 经过一番摆弄后,我发现我无法编写查询,因为我有一个过于严格的类型注释。你的建议奏效了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2011-05-14
    • 2016-02-08
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多