使用Scalaquery& amp;测试表/视图的存在。如果不存在则创建

时间:2012-02-22 14:27:59

标签: sql scala scalaquery

我正在编写一些测试来自动检查数据库(MS SQL) 服务器实例)具有某些视图,如果没有,则创建这些视图 使用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. 
  } 

基于此并且来自Stefan Zeiger's assertTablesExist example,我做了一个小方法来检查数据库的视图,如果 check会抛出视图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. 这不是将views参数键入为BasicTable的正确方法, 导致"error: class BasicTable takes type parameters"
  2. 地图参数v的范围正在发生一些时髦的事情, 结果为"error: value tableName is not a member of type parameter T0"
  3. 请原谅我对这个问题的无知,因为我怀疑它的根源 我的问题在于不了解Scala的类型系统。 伴随着这两个问题的是我没有的唠叨感 以最简洁或可读的方式完成了VerifyViewExists

1 个答案:

答案 0 :(得分:1)

由于你不关心类型参数是什么,你应该能够通过添加[_]来解决#1:

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

我的猜测是修复#1会导致#2消失。

顺便说一句,写foreach而不是map可能会更好,因为后者会将结果收集到一个我认为你不想要的新集合中。