首页 > 解决方案 > 返回 Slick 中的更新和删除查询

问题描述

我正在尝试调整这个问题的巧妙解决方案,以处理 Postgres 中的任意更新和删除查询。当结果查询中只有一个绑定参数时,它运行良好。例如:

users.filter(_.name === "Ann").map(_.name).updateReturning(users.map(_.name), "Jane")

产生工作报表

update "users" set "name" = ? where "users"."name" = 'Ann' returning "name"

但是,如果有多个参数,则会失败,例如在此查询中:

users.filter(_.created < OffsetDateTime.now).map(_.name).updateReturning(users.map(_.name), "Jane")

=>

update "users" set "name" = ? where "users"."created" < ? returning "name"

例如,其中“created”具有OffsetDateTime类型。我还没有弄清楚 Slick 何时将文字参数值放入查询中以及何时离开“?” 供 JDBC 填充(也许当参数是对象而不是原语时?)。所以它不必是 OffsetDateTime,只要是 vanilla Slick 或 slick-pg 支持的任何其他复杂类型。

在发布的解决方案中 newslick.sql.SqlStreamingAction是使用slick.jdbc.SQLActionBuilderwhich 接受 single构建的slick.jdbc.SetParameter[Unit]。有人可以解释它是如何工作的,以及如何构造它以不仅接受第一个查询参数,而且接受原始查询中定义的所有参数?

标签: postgresqlscalaslick

解决方案


推荐阅读