所以我有一些看起来像这样的代码:
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驱动程序和实际的数据库运行类似的代码没有问题。
答案 0 :(得分:5)
好的,所以我的问题是误解了INIT在H2中的工作原理。每次与数据库建立连接时,它都会执行操作(在本例中为来自...的脚本)。我认为它应该只在创建数据库时执行。在我的.sql文件中,我有CREATE TABLE
个语句,因此每次建立连接时都会执行它们。它们应该是CREATE TABLE IF NOT EXISTS
。添加IF NOT EXISTS
解决了我的问题。
Here是描述此行为的相关文档。
答案 1 :(得分:0)
此外,如果同一个光滑数据库连接有多个测试类,并且每次测试中每次重新创建表时,请确保禁用并行执行以进行测试。
答案 2 :(得分:-1)
这个例外对H2来说是惯用的,可以忽略(参见官方文档)。