任何想法如何在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)
}
答案 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语句。
我想你有两个表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方案仍然被注释,因此暂时从未执行过,然后应用了drop而对此表失败但是没有提高exeption。
关于组合行动的更多信息(组合者):