2015-04-21 3 views
0

Любая идея, как сделать условное падение в Slick 3.0, чтобы предотвратить An exception or error caused a run to abort: Unknown table 'MY_TABLE', если по какой-то причине его не существует?Условное падение таблиц в slick

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

ответ

0

Позвольте мне ответить на ваш вопрос, я думаю, вы можете сначала проверить наличие таблицы с помощью MTable затем удалить его, если он существует. Более или менее, как показано ниже:

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

Этот пример не компилируется в гладком 3.0 – LuGo

1

Я пошел по пути MTable, но, по крайней мере, в Postgres это большая стычка.

Попробуйте

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

Берегитесь вопросов индивидуальной чувствительности с именем таблицы. Я столкнулся с странными проблемами с postgres там - не знаю о mysql.

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' 

Который не будет работать

0

В настоящее время я использую платформу 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 схема еще комментировал так никогда не выполнялась на данный момент, и капля, однако применяется и не к этой таблице, но не поднимает ее.

Подробнее о сочетающих действий (комбинатор):

Смежные вопросы