如何在 Scala Slick 中运行补丁/部分数据库更新?

2024-04-26

我们想运行补丁/部分UPDATE使用 Slick (3.0.0),以便我们只修改记录中的某些字段。确切地说哪些字段将被更新只有在运行时才知道。

例如,对于一个REST PATCH request http://restcookbook.com/HTTP%20Methods/patch/.

目前我们运行一个SELECT首先获取原始记录然后运行UPDATE但最好在单个 SQL 语句中完成此操作。

像这样的事情:

def patchPerson(name: Option[String], age: Option[Int]) = {
   people.filter(_.name === "M Odersky")
       .map(p => 
           (name, age) match {
              case (Some(_), Some(_)) => (p.name, p.age)
              case (Some(_), None)    => (p.name)
              case (None   , Some(_)) => (p.age)
           }
       )
       .update(
           (name, age) match {
              case (Some(_), Some(_)) => (name.get, age.get)
              case (Some(_), None)    => (name.get)
              case (None   , Some(_)) => (age.get)
           }
       )
}

(请忽略这里丑陋的代码)

上面的代码无法编译,并出现以下错误消息:

未找到匹配的形状。 Slick 不知道如何映射给定的 类型。可能的原因:Table[T]中的T与您的*不匹配 投影。或者您在查询中使用了不受支持的类型(例如 scala 列表)。所需级别:slick.lifted.FlatShapeLevel 源类型: 对象 未打包类型:T 打包类型:G

And:

方法映射没有足够的参数:(隐式形状: slick.lifted.Shape[_ <: slick.lifted.flatshapelevel t g>

我认为这是因为 Slick 期望元组长度和类型与两个结果相匹配filter and update功能。

我们尝试过使用 Slick异构列表 http://slick.typesafe.com/doc/3.0.0/api/index.html#slick.collection.heterogeneous.HList类,但这似乎也期望长度和类型匹配。

有没有一种方法可以在 Slick 中编写此代码,以便我们可以通过一次数据库调用来更新记录中的任意数量的字段?


为什么不在构建更新查询之前进行模式匹配?

def patchPerson(name: Option[String], age: Option[Int]) = {
   val query = people.filter(_.name === "M Odersky")
   (name, age) match {
     case (Some(name), Some(age)) =>
       query.map(p => (p.name, p.age)).update(name, age)
     case (Some(name), None) =>
       query.map(p => p.name).update(name)
     case (None, Some(age)) =>
       query.map(p => p.age).update(age)
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala Slick 中运行补丁/部分数据库更新? 的相关文章

随机推荐

  • 正则表达式:将单词与侵入性符号相匹配

    我试图将所有 单词 与侵入性星号相匹配 包括开头和结尾 但没有其他标点符号 例如 我期待下面的七场比赛 相反 我得到了两个 text star tar s ar st r sta tar sta sta p re compile r b w
  • Android 风格特定的依赖树

    我的 Android 应用程序有多种风格 生产 Staging Review等以及Release and Debug构建类型 当我跑步时 gradlew app dependencies它自然地返回每个风味 构建类型的依赖树 生产发布 生产
  • CSS 中的重叠文本 - 如何更改它?

    我正在尝试更改 css 文件中的重叠元素 文本 一行文本 在常规浏览器中 在移动设备中显示为两行文本 重叠在一起 此更改适用于网站的移动版本 横向平板电脑的 media 部分 目前 标题 h2 文本在 iPad 平板电脑上重叠 来自 h2
  • 自定义菜单快捷键

    I am working on an application that has a Menu on top of it I want to use a different method for shortcut keys being thi
  • chrome和firefox中的getTime结果不同

    我需要转换Date反对timestamp 所以创建新的Date来自日期时间的对象和使用getTime 但它在 Chrome 和 Firefox 中产生不同的结果 这取决于时区 var date new Date 2013 08 26T14
  • C# 对象的事务?

    只是好奇 是否支持普通 C 对象上的事务 喜欢 using var transaction new ObjectTransaction obj try obj Prop1 value obj Prop2 value obj Recalcul
  • Hive(查找连续 n 列中的最小值)

    我在 Hive 中有一个表 有 5 列 即电子邮件 a first date b first date c first date d first date a b c d 是用户可以执行的 4 个不同操作 上表中的 4 列表示用户执行第一个
  • 在 TFS 中以不同方式共享项目文档,您的最佳实践是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道在 TFS 2010 中管理 和版本控制 不同类型的项目文档 例如版本控制目标文档 例如 用例 主测试计划 质量保证计划和非版本控制相关
  • SQLAlchemy Pandas 从 jsonb 读取 sql

    我想用 pandas 生成一个数据框read sql https pandas pydata org pandas docs stable generated pandas read sql html来自我使用 PostgreSQL 进行的
  • 更改永久链接 WordPress 后出现 404 错误

    我的网站是一个Wordpress site创建于PHP 我已将永久链接默认更改为帖子名称 它工作得很好Chrome and Firefox但在 IE8 中不行 首页显示正确 但当我单击另一个页面的链接时 它显示 404 页面未找到错误 我使
  • Hibernate不生成级联

    我有一套hibernate hbm2ddl auto创建以便 Hibernate 为我在 mysql 中创建表 但是 休眠似乎没有正确添加Cascade关于表中的参考文献 然而 当我删除一行 并且我有一个删除级联作为休眠注释时 它确实有效
  • 强制 C++ 编译器检查异常处理

    我想知道是否有一些编译器参数 最好是在 gcc g 中 它将缺少 try catch 块视为错误 这是java中的标准行为 我一直很喜欢它 由于 Java 中的检查异常依赖于throw签名 您可以阅读为什么您不想使用throwC 中的函数签
  • MySQL 唯一 id 或组合 id

    我的项目和开发人员计划的结构如下 developer table id developer name etc project table id project name etc developer project table 因为一个开发人
  • php zlib:如何从字符串变量动态创建内存中的zip文件?

    这就是我需要的 a array folder gt anyfolder filename gt anyfilename filedata gt anyfiledata 我需要使用 a 中的压缩数据创建一个变量 zip 并将此 zip 输出到
  • Sass 更改监视间隔,更频繁地编译

    我正在使用 sass 将 scss 编译为 css 每次保存后 大约需要 15 20 秒才能编译为 scss 文件到 css 因此我需要刷新几次才能看到预期结果 有没有办法告诉 Sass 更频繁地检查更改 这是我使用的命令 sass wat
  • C# 中的随机数 [重复]

    这个问题在这里已经有答案了 可能的重复 随机数生成器没有按我计划的方式工作 C https stackoverflow com questions 767999 random number generator not working the
  • SharePoint 404 页面

    最好的位置是在 web config customError 部分中为 SharePoint 设置 404 错误页面 还是网站集 Web 应用程序上有配置设置 请阅读这个博客 http blogs msdn com jingmeili ar
  • 退出 glutFullScreen()

    我不明白为什么当我按 f 时它进入全屏但不退出全屏 在这个方法的开头我已经设置了bool fullscreen false 这是我的切换代码 case f toggle screenmode if fullscreen glutFullSc
  • 如何在 r 中绘制 LDA 的双标图?

    我使用该函数进行了线性判别分析lda 来自 MASS 包 现在我会尝试绘制像 ade4 包 forLDA 中那样的双标图 你知道我该怎么做吗 如果我尝试使用biplot 功能不起作用 例如 如果我使用 Iris 数据并制作 LDA dis2
  • 如何在 Scala Slick 中运行补丁/部分数据库更新?

    我们想运行补丁 部分UPDATE使用 Slick 3 0 0 以便我们只修改记录中的某些字段 确切地说哪些字段将被更新只有在运行时才知道 例如 对于一个REST PATCH request http restcookbook com HTT