2012-02-22 4 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에서 cribbing, 내가보기에 대한 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. 이의 의견 매개 변수를 입력 할 수있는 권리 방법이 아니다 : 나에게 합리적인 것처럼 보이지만이 문제가

    BasicTable로, 펑키 "error: class BasicTable takes type parameters"

  2. 뭔가 "error: value tableName is not a member of type parameter T0"의 결과로,지도 인수 V의 범위와 일어나고 결과.

이 질문에 대한 나의 무지로, 내 뿌리가 스칼라 유형 시스템을 이해하지 못하는 것에 있다고 생각합니다. 그 두 가지 문제와 함께 나는 을 실제로하지 못했다는 느낌이 들었습니다. VerifyViewExists은 가장 간결하고 읽기 쉬운 스타일입니다.

답변

1

는 형식 매개 변수가 무엇인지 상관하지 않기 때문에, 당신은 추가 # 1를 해결 할 수 있어야한다 [_] :

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

내 생각 엔 # 1을 고정하는 # 2를 일으킬 것 사라질 것입니다 .

그런데지도가 아닌 foreach를 작성하는 것이 좋습니다. 이는 후자가 결과를 새 컬렉션으로 수집하기 때문에 내가 원하는 것으로 생각하지 않습니다.

+0

예, 구문 비트가 누락되었습니다. 감사! – Noel