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

4 回答 4

2

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

尝试

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

注意表名是否区分大小写。我在那里的 postgres 遇到了奇怪的问题——不知道 mysql。

于 2015-04-21T16:16:56.513 回答
0

让我试着回答你的问题,我想你可以先检查表的可用性,MTable然后如果它存在就删除它。或多或少像下面这样:

import scala.slick.jdbc.meta._
if (MTable.getTables("table_name").list().isEmpty) {
    //do something here..
}
于 2015-04-21T13:02:03.740 回答
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)

请注意您需要如何使用 #${} 而不是 ${} 否则 slick 会触发类似的内容:

DROP TABLE IF EXISTS 'PERSON'

哪个行不通

于 2016-02-06T03:04:17.737 回答
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 方案仍被注释,因此暂时从未执行过,但是应用了丢弃并失败到此表,但不会引发异常。

更多关于组合动作(组合器):

于 2017-06-29T11:46:49.297 回答