【问题标题】:H2 database automatically trying to create itself in SlickH2 数据库自动尝试在 Slick 中创建自己
【发布时间】:2014-11-25 12:54:14
【问题描述】:

所以我有一些看起来像这样的代码:

val conn_str = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MYSQL;INIT=runscript from 'schema.sql'"
val database = Database.forURL(conn_str, driver="org.h2.Driver"
database withTransaction {
   // add some stuff to the database
   // query database
}

当它到达 withTransaction 块时,抛出异常:

org.h2.jdbc.JdbcSQLException: Table already exists; SQL statement: ...

堆栈跟踪看起来像是在尝试使用 Slick 的 ddl 语法创建表。我从未指定要使用 Slick 创建数据库。这是 H2 的事情吗,因为我使用 MySQL 驱动程序和实际数据库运行了类似的代码,没有问题。

【问题讨论】:

    标签: scala h2 slick


    【解决方案1】:

    好的,所以我的问题是误解了 INIT 在 H2 中的工作方式。每次与数据库建立连接时,它都会执行操作(在这种情况下,从...运行脚本)。我认为它应该只在创建数据库时执行。在我的 .sql 文件中,我有 CREATE TABLE 语句,因此每次建立连接时都会执行它们。他们应该是CREATE TABLE IF NOT EXISTS。添加IF NOT EXISTS 解决了我的问题。

    Here 是描述此行为的相关文档。

    【讨论】:

      【解决方案2】:

      此外,当您有多个测试类用于同一个光滑的数据库连接时,并且在每个测试中,如果您每次都重新创建表,请确保禁用并行执行测试。

      【讨论】:

        【解决方案3】:

        这个异常对 H2 来说是惯用的,可以忽略(参见官方文档)。

        【讨论】:

        • this 是您所指的文档吗?我似乎找不到其他适用的东西。
        • 另外,如何忽略异常?如果在创建事务时发生异常,我将如何实际运行任何查询或插入?
        • 我不知道你所说的“这个例外对 H2 来说是惯用的”是什么意思。我首先必须检查惯用语的意思,但这个词在这种情况下似乎没有意义。
        猜你喜欢
        • 2016-01-09
        • 2021-08-14
        • 2019-01-12
        • 2014-04-10
        • 2019-01-18
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多