Проверьте наличие таблицы / представления с помощью Scalaquery и создайте, если нет - PullRequest
0 голосов
/ 22 февраля 2012

Я пишу несколько тестов для автоматизации проверки, имеет ли база данных (экземпляр MS SQL Server) определенные представления, а если нет, создает эти представления с использованием объекта BasicTable.Примерно так:

  @Test def CheckAndBuildViewsOnDB() = { 
    VerifyViewExists(FooTable, BarTable) //FooTable et al defined as: 
FooTable extends BasicTable[Foo], where Foo is a case class & FooTable 
has a DDL create defined. 
  } 

Основываясь на этом и набрасывая из Стефана Цайгера assertTablesExist пример , я сделал небольшой метод для проверки БД на вид, и если проверка выдаетисключение вызывает BasicTable ddl.create:

  def VerifyViewExists(views:BasicTable*) = { 
    DatabaseSession.session() withSession { //helper class which 
initiates a db connection & session 
      views map { 
        v => (try queryNA[Int]("select 1 from '"+ v.tableName +"' 
where 1<0").list 
            catch {case _: Exception => v.ddl.create; 
println("Couldn't find view "+v.tableName+", creating it 
now...");}) 
      } } } 

, что кажется мне разумным, но имеет две проблемы:

  1. это неправильный способ ввода параметра представлений какBasicTable, в результате чего "error: class BasicTable takes type parameters"
  2. происходит нечто странное с областью действия аргумента карты v, что приводит к "error: value tableName is not a member of type parameter T0".

Извините за незнание этого вопроса, так как я подозреваю, что корень моей проблемы лежит в непонимании системы типов Скалы.Наряду с этими двумя проблемами возникает ноющее чувство, что я на самом деле не сделал VerifyViewExists в самом лаконичном или читабельном стиле.

1 Ответ

1 голос
/ 27 апреля 2012

Поскольку вас не волнует, что является параметром типа, вы должны решить # 1, добавив [_]:

def VerifyViewExists(views:BasicTable[_]*) = { 

Я предполагаю, что исправление # 1 приведет к тому, что # 2исчезают.

Кстати, может быть, лучше написать foreach, а не map, поскольку последний соберет результаты в новую коллекцию, которую, я не думаю, вы хотите.

...