【问题标题】:Can I build update query with variable fields without using plain SQL?我可以在不使用普通 SQL 的情况下使用变量字段构建更新查询吗?
【发布时间】:2026-02-06 15:05:01
【问题描述】:

我可以在不使用普通 SQL 的情况下构建具有可变数量字段的更新查询吗?

例如,单列的更新很简单——我只是让它来创建窄查询。

Query(RolesTable).filter((role: RolesTable.type) => role.id === role_id).map((role: RolesTable.type) => role.name).update(name)

但是如果Role 有 5 个字段并且我想让 API 客户端向我发送他想要更新的字段怎么办?我将如何构建这样的查询?

【问题讨论】:

    标签: scala scala-2.10 slick


    【解决方案1】:

    这里的关键是在产生选定列时使用~ 运算符。使用文档中的示例模型:

    case class User(id: Option[Int], first: String, last: String)
    object UsersTable extends Table[User]("users") {
      def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
      def first = column[String]("first")
      def last = column[String]("last")
      def * = id.? ~ first ~ last <> (User, User.unapply _)
    }
    

    基于您的示例的选择如下所示:

    val cols = Query(UsersTable).filter((user: UsersTable.type) => user.id === userId).map((user: UsersTable.type) => user.first ~ user.last)
    

    然后update 调用将是:

    cols.update((newFirst,newLast))
    

    另外,如果你愿意,你可以将你的选择重写为一个 for comprehension,因为它会缩短一点:

    val cols = for(user <- UsersTable if (user.id === userId)) yield user.first ~ user.last
    cols.update((newFirst,newLast))
    

    【讨论】:

    • 但是如果应该连接的字段只有在运行时才知道呢?
    • 我猜你不能用我上面的方法做到这一点。将列组合在一起会创建一个投影,该投影静态类型化到组合在一起的列。然后,update 签名基于此投影的类型,并且都可以在编译时检查其正确性。我只是不确定这将如何与动态列列表一起使用,然后使用一组动态值来调用update
    最近更新 更多