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

mp9*_*p94 1 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
}
Run Code Online (Sandbox Code Playgroud)

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

org.h2.jdbc.JdbcSQLException: Table already exists; SQL statement: ...
Run Code Online (Sandbox Code Playgroud)

并且堆栈跟踪看起来像是尝试使用Slick的ddl语法创建表.在任何时候我都没有指定我想使用Slick创建数据库.这是H2的事情,因为我使用MySQL驱动程序和实际数据库运行类似的代码没有问题.

mp9*_*p94 5

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

以下是描述此行为的相关文档.