我目前正在使用 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 方案仍处于注释状态,因此目前从未执行过,但是应用了丢弃并失败到此表,但不会引发异常。
更多关于组合动作(combinator):