2017-10-14 91 views
0

我試圖落實 https://github.com/ArchDev/akka-http-rest 提供的阿卡-HTTP其餘的例子,但我堅持用如何解決單自動遞增列的油滑異常返回上INSERT

slick.SlickException: This DBMS allows only a single column to be returned from an INSERT, and that column must be an AutoInc column. 
    at slick.jdbc.JdbcStatementBuilderComponent$JdbcCompiledInsert.buildReturnColumns(JdbcStatementBuilderComponent.scala:67) 

這裏是Scala代碼: 註冊API:

path("signUp") { 
    pathEndOrSingleSlash { 
     post { 
     entity(as[UsernamePasswordEmail]) { userEntity => 
      complete(Created -> signUp(userEntity.username, userEntity.email, userEntity.password)) 
     } 
     } 
    } 
    } 

AuthService.scala

def signUp(login: String, email: String, password: String): Future[AuthToken] = 
    authDataStorage 
     .saveAuthData(AuthData(UUID.randomUUID().toString, login, email, password.sha256.hex)) 
     .map(authData => encodeToken(authData.id)) 

AuthDataStorage.scala

... 
override def saveAuthData(authData: AuthData): Future[AuthData] = 
    db.run((auth returning auth).insertOrUpdate(authData)).map(_ => authData) 
... 

由於我是新來的Scala和油滑,反正可以提供,爲什麼即使我在模型中定義O.AutoInc此異常發生的信息。我正在使用MySQL RDBMS

回答

0

問題出在returning auth。而不是返回auth即完整的對象,只需返回自動增量Id id。 Slick不支持返回完整的對象,但它編譯正確。它不會生成有效的SQL查詢。

一旦您可以訪問自動增量id,那麼您可以使用函數的參數構建AuthData

代碼:

(auth returning auth.map(_.id)).insertOrUpdate(authData)).map(id => authData.copy(id = id)) 
0

唯一的例外是MySQL的行爲的結果。正如Slick documentation所述:

許多數據庫系統只允許返回一個列,它必須是表的自動遞增主鍵。如果您要求其他列在運行時拋出SlickException(除非數據庫實際支持它)。

更改saveAuthData方法上的UPSERT返回id柱:

override def saveAuthData(authData: AuthData): Future[AuthData] = 
    db.run((auth returning auth.map(_.id)).insertOrUpdate(authData)) 
    .map(idFromDb => authData.copy(id = idFromDb.getOrElse(authData.id))) 

在上面的代碼,idFromDb是用於插入一個Some[Int]和用於更新一個None

+0

上面的代碼給出了同樣的問題: –

+0

你可以看看這個分叉的回購:[akka-http-rest](https://github.com/itsursujit/akka-http-rest) –