H2数据库自动尝试在Slick中创建自己

时间:2014-09-30 19:27:22

标签: scala h2 slick

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

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驱动程序和实际的数据库运行类似的代码没有问题。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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