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. 
  } 

これとStefanZeigerassertTablesExistからの引用に基づいて、ビューのdbをチェックするための小さなメソッドを作成しました。チェックによって例外がスローされた場合は、そのビューの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...");}) 
      } } } 

これは私には合理的に思えますが、2つの問題があります。

  1. BasicTableこれは、viewsパラメータをとして入力する正しい方法ではありません。"error: class BasicTable takes type parameters"
  2. マップ引数vのスコープで何かファンキーなことが起こっており、結果として"error: value tableName is not a member of type parameter T0"

私の問題の根本はScalaの型システムを理解していないことにあると思うので、この質問についての私の無知を許してください。VerifyViewExistsこれらの2つの問題に加えて、私が最も簡潔で読みやすいスタイルで実際に行ったことがないというしつこい感じがあります。

4

1 に答える 1

1

タイプパラメータが何であるかは気にしないので、[_]を追加することで#1を解決できるはずです。

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

私の推測では、#1を修正すると#2が消えます。

ちなみに、マップよりもforeachを書く方が良いかもしれません。後者は結果を新しいコレクションに収集するので、私はあなたが望んでいないと思います。

于 2012-04-27T04:11:57.113 に答える