使用 ROM 和 Sequel 进行 UPSERT(插入或更新)操作

主要观点:

  • 讨论在处理包含多个球员的棒球队编辑页面时,如何实现类似 UPSERT 的操作以更新球队和球员信息。
  • 介绍了 Postgres 中没有直接的 UPSERT 命令,但有 ON CONFLICT DO 子句可用于处理插入冲突。
  • 展示了如何将 HTML 表单数据转换为适合 Postgres 的格式,并处理插入和更新操作中的各种问题。
  • 提供了两种解决方案:直接访问 Postgres 序列获取新记录的 id 和使用 DEFAULT 关键字处理缺失的 id。
  • 最后在 Hanami 应用的 ROM 存储库中实现了该逻辑。

关键信息:

  • 理想解决方案是为每个球队和球员实体放置多个表单,但当前处于 MVP 阶段,只渲染一个球队编辑表单,包含球员集合。
  • Postgres 9.5 开始支持 ON CONFLICT DO 子句,可在插入冲突时执行更新操作。
  • 数据形状需考虑 HTML/HTTP/应用程序的往返,例如在球员属性中不包含 team_id 等。
  • 直接访问 Postgres 序列时需使用 nextval 函数获取下一个 id 值。
  • 使用 DEFAULT 关键字可处理新记录的缺失 id 问题。

重要细节:

  • 在 SQL 中,插入值列表的每个数组必须包含与列列表相同数量的元素,且必须为每个列提供值。
  • 在 Ruby 中,使用 Sequel 库实现插入冲突操作,需提供冲突选项和数据列表。
  • 在 Hanami 应用中,可使用 ROM 的 dataset 方法和 Sequel 方法在存储库中实现逻辑。
  • 可参考相关指南和学习 Postgres 的 MERGE 命令以进一步了解和扩展。
阅读 17
0 条评论