我目前在其 3.2.0 版本中使用 Slick 框架。我给出的解决方案可能适用于早期版本的框架,但我没有验证这一点。
如果唯一的问题是删除表(如果它存在而不抛出异常),您可以为此使用 Actions 的组合器。
我有一系列测试,我为内存数据库中的 H2 上的每个测试运行 create/populate/drop 语句。我想你有两个表Canal
和SubCanal
(SubCanal 在 Canal 上有一个外键,所以如果它存在,你想先删除它)因为你已经声明了TableQuery
变量,例如:
lazy val canals = TableQuery[CanalTable]
lazy val subcanals = TableQuery[SubCanalTable]
// we don't put SubCanals to check if no exeption is produced and then
// add it for further testing.
lazy val ddl = canals.schema // ++ subcanals.schema
...我提供了如下辅助方法:
def create: DBIO[Unit] = ddl.create
def drop: DBIO[Unit] = ddl.drop
def popCanal = canals ++= Seq(
Canal("Chat"),
Canal("Web"),
Canal("Mail"))
以上只是创建动作,但很酷的是 Slick 会尝试删除SubCanal
表和Canal
表,但会将异常封装在Try[...]
. 所以这将顺利运行:
val db = Database.forConfig("yourBaseConfig")
val res = db.run(drop)
这也将运行:
val db = Database.forConfig("yourBaseConfig")
val res1 = db.run(
create >>
popCanal >>
canals.result
)
.... some interesting computation ...
val res2 = db.run(drop)
注意:SubCanal 方案仍被注释,因此暂时从未执行过,但是应用了丢弃并失败到此表,但不会引发异常。
更多关于组合动作(组合器):