2013-04-22 2 views
2

모델 사용자를 업데이트하기 위해 DAO를 쓰고 있습니다. Slick이 기본 키 열을 업데이트하지 못하게하는 방법은 무엇입니까?

case class User(id: Option[String] = None, username: String, password: String) 


    object Users extends Table[User]("user") { 

    // .... some column defines 

    def * = id.? ~ username ~ password <>(User, User.unapply _) 


    def byId(id: String) = Query(Users).filter(_.id === id) 

    // user.id will be None since id is passed as parameter. 
    def update(id: String, user: User)(implicit session: Session) = { 
     byId(id).update(user) 
     getById(id) 
    } 

나는이 오류가 발생했습니다 :

[error]  JdbcSQLException: NULL not allowed for column "id"; SQL statement: 
[error] update "user" set "id" = ?, "username" = ?, "password" = ? where "user". 
"id" = 'RBq0kJAs' [23502-168] (DbException.java:169) 

그것은 슬릭 보인다는 아무 소용이 없습니다 기본 열 "ID"를 업데이트하는 SQL 문을 생성하고 여기에 코드입니다. 생성 된 업데이트 쿼리에서 id 열을 어떻게 제거 할 수 있습니까? Slick Documentation 따르면

답변

1

:

업데이트 데이터가 업데이트하도록 선택하는 쿼리를 작성하고, 새로운 데이터로 대체함으로써 수행된다.

쿼리에서 id을 선택하므로 업데이트 명령문이이를 대체하려고 시도합니다. - 설명서의 예제를 확인해보십시오 (위 링크 참조).

+0

감사합니다. – spacedragon

0

v9.5에서 테스트 한 Postgres SQL에서 실행 중이면 insertOrUpdate 슬릭 호출을 사용할 수 있습니다.

// Assuming table query is property `users` 
private val users = TableQuery[UsersTable] 

def update(id: String, user: User)(implicit session: Session):Future[User] = 
    for { 
     _ ← db.run(users.insertOrUpdate(user)) 
     readBack ← getById(id) // Existing query against `users` 
    } yield readBack 
관련 문제