В настоящее время я использую платформу Slick в ее версии 3.2.0. Решение, которое я даю, может применяться к более ранней версии фреймворка, но я не подтвердил этот момент.
Если проблема только в том, чтобы капли таблицу, если она существует без метания исключения вы можете использовать комбинатор из действий для этого.
У меня есть серия тестов, для которых я запускаю инструкцию create/populate/drop для каждого теста на H2 в базе данных памяти. Я полагаю, у вас есть две таблицы Canal
и SubCanal
(SubCanal имеет внешний ключ на канал, так что вы хотели бы бросить его первым, если он существует), для которым вы уже объявили 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 схема еще комментировал так никогда не выполнялась на данный момент, и капля, однако применяется и не к этой таблице, но не поднимает ее.
Подробнее о сочетающих действий (комбинатор):
Этот пример не компилируется в гладком 3.0 – LuGo