2012-02-22 12 views
0

データベース(MS SQL サーバーインスタンス)に特定のビューがあるかどうかのチェックを自動化するテストを作成しています。 BasicTableオブジェクトです。以下のような 何か:これに基づきScalaqueryでテーブル/ビューの存在をテストします。存在しない場合は作成します。

@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からカンニングは、私は、ビューのための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...");}) 
     } } } 

  1. これはビューパラメータを入力するための正しい方法ではありません。私には合理的なようだが、2つの問題がある

    BasicTable、 となり、map引数vのスコープ「 」で何かが起きて、"error: value tableName is not a member of type parameter T0"という結果になりました。

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

答えて

1

あなたはtypeパラメータが何であるかを気にしないので、あなたが追加することにより、#1を解決することができます[_]:

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

私の推測では、#1を固定することは#2を引き起こすこと消えています。

ところで、マップではなくforeachを書く方がよいでしょう。後者は結果を新しいコレクションに集めます。私はあなたが望むとは思っていません。

+0

はい、それは私が欠けていた構文ビットです。ありがとう! – Noel

関連する問題