我正在写一个用于更新模型用户的dao;这是代码:
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)
似乎Slick生成了一个SQL语句,它更新了主列“id”,没有任何意义。 如何从生成的更新查询中删除id列?
答案 0 :(得分:1)
通过编写选择要更新的数据然后用新数据替换它的查询来执行更新。
因此,由于您的查询选择了id
,因此更新语句会尝试替换它。 - 您可能想查看文档中的示例(请参阅上面的链接)。
答案 1 :(得分:0)
在Postgres SQL上运行(在v9.5上测试),您可以使用insertOrUpdate
Slick调用。
// 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