2016-07-08 5 views
3

문서를 통해 업데이트를 컴파일 할 수 있다고하더라도 Slick 3.1에서 업데이트 할 값이 컴파일 된 블록으로 전달되는 업데이트를 컴파일하는 데 문제가 있습니다.Slick 3.1에서 매개 변수화 된 업데이트를 컴파일하는 방법은 무엇입니까?

필자는 비활성화 키가 null 인 주어진 키를 가진 행을 찾고 비활성화 시간을 새로운 타임 스탬프로 설정하려고합니다. 이 날 updateRep[Option[Instant]]을 수 없다는 불만를 제공, 불행하게도

private[this] lazy val updateDeactiveTime = Compiled { (settingName: Rep[String], time: Rep[Instant]) => 
    settings 
     .filter { row => row.name === settingName && row.deactivatedAt.isEmpty } 
     .map { _.deactivatedAt } 
     .update(Some(time)) 
    } 

: 내가하고 싶은 것

분명한 것은 이것이다 그것이 Option[Instant]를 원한다.

슬릭 (불행히도)은 업데이트에서 동적으로 계산 된 값을 사용할 수 없음을 알고 있습니다. 문서별로 제한 작업과 같은 문제 해결 방법은 ConstColumn[…]을 사용하는 것입니다. 충실하게, 나는 암시 적 변환이나 확장이 있기를 바라고 ConstColumn[Option[Instant]]을 전달하려고 시도했지만, 여전히 문자 그대로 Option[Instant]이어야한다는 불만을 얻는다.

물론 리터럴 인스턴트가 있지만 대상 값이 변경 될 때마다 다시 컴파일해야하는 경우 업데이트를 컴파일하는 데 많은 포인트가 없습니다.

LiteralColumn[…]을 사용하려면 _.value으로 전화 할 수 있지만 Compiled으로 전화하면 LiteralColumn이 필요하지 않습니다. Compiled 또한 내 매개 변수가 time: Instant 일 수 있도록 허용하지 않습니다.

답변

2

외부에 컴파일 된 부분이 인 경우 update 작업을 수행하십시오. 이것은 여전히 ​​편집의 이점을 제공합니다.

private[this] lazy val deactiveTime = Compiled { (settingName: Rep[String]) => 
    settings 
     .filter { row => row.name === settingName && row.deactivatedAt.isEmpty } 
     .map { _.deactivatedAt } 
    } 
    def updateDeactiveTime(settingName: String, time: Instant) = { 
    deactiveTime(settingName).update(Some(time)) 
    } 

그것은 당신이 Compiled을 수행 할 때, 슬릭 실제로는, 삽입, 업데이트에 사용할 삭제를 선택합니다 네 가지 컴파일 목표를 만들고 것으로 나타났다. 각 특정 양식은 처음 사용할 때 완전히 컴파일됩니다. API for CompiledFunction에서 명시 적으로 확인할 수 있습니다.