如何配置Slick以在会话之间保留表?

时间:2014-08-02 03:14:23

标签: database scala h2 slick

我在设置Slick 2.0.2时遇到了一些问题。我在一个会话中执行的任何配置都会丢失。例如,在第一个会话中,我创建表并添加三个人:

// H2 in-memory database
lazy val db = Database.forURL("jdbc:h2:mem:contacts", driver="org.h2.Driver")

// Contacts table
lazy val contacts = TableQuery[ContactsSchema]

// Initial session
db withSession { implicit session =>
  contacts.ddl.create

  // Inserts sample data
  contacts += Person("John", "123 Main street", 29)
  contacts += Person("Greg", "Neither here nor there", 40)
  contacts += Person("Michael", "Continental U.S.", 34)

  // Successfully retrieves data
  contacts foreach { person =>
    println(person)
  }
}

一切都很顺利。输出重复我添加的三个人。当我开始新会议时,我开始遇到问题。

// New session in which the previous data is lost
db withSession { implicit session =>
  contacts foreach { person =>
    println(person)
  }
}

上述块会创建org.h2.jdbc.JdbcSQLException: Table "CONTACTS" not found例外。如果我编辑如下

db withSession { implicit session =>
  contacts.ddl.create
  contacts foreach { person =>
    println(person)
  }
}

然后删除所有数据。

我看到Scalatra guide to Slick使用了与我相似的配置。我究竟做错了什么?如何在会话之间保持数据持续存在?我使用内存数据库的事实是否与它有关?

1 个答案:

答案 0 :(得分:1)

两种选择。

创建会话并保持打开状态。这可以通过调用堆栈上的withSession范围或db.createSession来完成。

或者将;DB_CLOSE_DELAY=-1添加到数据库网址。只要vm运行,这就会使db保持活动状态。

请参阅http://www.h2database.com/html/features.html#in_memory_databases