0

我正在编写一些测试来自动检查数据库(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. 
  } 

基于此并借鉴Stefan Zeiger 的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. 这不是将 views 参数键入为 的正确方法BasicTable,导致"error: class BasicTable takes type parameters"
  2. map 参数 v 的范围发生了一些奇怪的事情,导致"error: value tableName is not a member of type parameter T0".

请原谅我对这个问题的无知,因为我怀疑我的问题的根源在于不了解 Scala 的类型系统。VerifyViewExists伴随着这两个问题的是,我还没有真正以最简洁或可读的方式完成的唠叨感觉。

4

1 回答 1

1

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

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

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

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

于 2012-04-27T04:11:57.113 回答