有条不紊地删除表中的表格

时间:2015-04-21 12:40:57

标签: mysql scala slick-3.0

任何想法如何在Slick 3.0中进行条件下拉,以防止An exception or error caused a run to abort: Unknown table 'MY_TABLE'如果由于某种原因它不存在?

def clear = {
    val operations = DBIO.seq(
      myTable.schema.drop,
      // other table definitions
      ...
    )
    db.run(operations)
  }

4 个答案:

答案 0 :(得分:1)

我走了MTable路线,但至少在Postgres,这是一个很大的麻烦。

尝试

def qDropSchema = sqlu"""drop table if exists your-table-name;""";

注意表名称的区分大小写问题。我遇到了postgres的奇怪问题 - 不知道mysql。

答案 1 :(得分:0)

让我尝试回答您的问题,我认为您可以先使用MTable检查表的可用性,然后将其删除(如果存在)。或多或少如下:

import scala.slick.jdbc.meta._
if (MTable.getTables("table_name").list().isEmpty) {
    //do something here..
}

答案 2 :(得分:0)

我这样做了:

val personQuery = TableQuery[PersonTable]
val addressQuery = TableQuery[AddressTable]
...
val setupAction = DBIO.seq(
  sqlu"SET FOREIGN_KEY_CHECKS = 0",
  sqlu"DROP TABLE IF EXISTS #${personQuery.baseTableRow.tableName}",
  sqlu"DROP TABLE IF EXISTS #${addressQuery.baseTableRow.tableName}",
  sqlu"SET FOREIGN_KEY_CHECKS = 1",
)
val setupFuture = db.run(setupAction)

注意你需要使用#$ {}而不是$ {},否则光滑会触发:

DROP TABLE IF EXISTS 'PERSON'

哪个不起作用

答案 3 :(得分:0)

我目前正在3.2.0版本中使用Slick框架。 我给出的解决方案可能适用于早期版本的框架,但我没有证实这一点。

如果唯一的问题是删除该表如果存在而不会抛出异常,则可以使用Actions的组合器来实现此目的。

我有一系列的测试,我为内存数据库中的H2上的每个测试运行create / populate / drop语句。 我想你有两个表CanalSubCanal(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方案仍然被注释,因此暂时从未执行过,然后应用了drop而对此表失败但是没有提高exeption。

关于组合行动的更多信息(组合者):