【问题标题】:How to prevent Slick from updating the primary key column?如何防止 Slick 更新主键列?
【发布时间】:2013-04-15 11:54:08
【问题描述】:

我正在编写一个用于更新模型用户的 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 列?

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    根据Slick Documentation

    通过编写一个选择要更新的数据然后用新数据替换它的查询来执行更新。

    因此,由于您的查询选择了id,更新语句会尝试替换它。 – 您可能需要查看文档中的示例(请参阅上面的链接)。

    【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 2015-01-10
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多