【问题标题】:INSERT ON CONFLICT DO UPDATE using pg-promise helpers for multi row insert/updateINSERT ON CONFLICT DO UPDATE 使用 pg-promise 助手进行多行插入/更新
【发布时间】:2020-11-29 07:26:41
【问题描述】:

我正在尝试使用 pg-promise 向 pgsql 数据库插入多行。就我而言,我试图插入的几条记录可能已经存在于表中。在这种情况下,我需要更新它们。通过查看pg-promise official documentaion,我发现可以使用helpers 插入或更新多行。除了多次插入/更新之外,有什么方法可以像下面那样做吗?

INSERT INTO table_name(column_list) 
VALUES(value_list)
ON CONFLICT target action;

【问题讨论】:

  • 是的,只需使用帮助程序创建插入值查询,然后将ON CONFLICT … 添加为字符串。
  • @Bergi 是的,差不多。无论如何,我添加了我的答案,可能会有所帮助:)
  • @vitaly-t 是的,但我完全不知道它会是什么样子,我也不知道assignColumns

标签: javascript sql node.js pg-promise


【解决方案1】:

在某处创建静态变量:

const cs = new pgp.helpers.ColumnSet(['first', 'second', 'third', 'fourth'], 
                                      {table: 'my-table'});

// let's assume columns 'first' and 'second' produce conflict when exist:
const onConflict = ' ON CONFLICT(first, second) DO UPDATE SET ' +
    cs.assignColumns({from: 'EXCLUDED', skip: ['first', 'second']});

在下面的示例中,我们假设您的 data 是一个有效对象数组:

const upsert = pgp.helpers.insert(data, cs) + onConflict; // generates upsert

await db.none(upsert); // executes the query:


附加功能

如果您希望所有 SQL 以大写而不是小写生成,您可以设置选项capSQL:

const pgp = require('pg-promise')({
  capSQL: true
});

查看生成和执行内容的最佳方式是借助 pg-monitor

【讨论】:

  • 如果您的更新依赖于当前值怎么办?像 first = my-table.first + EXCLUDED.first 你应该只是将它添加到 onConflict 查询的一部分,还是可以用 assignColumns 做点什么?
  • @MariusMircea 您只需要手动附加,assignColumns 只是为了简化常规分配,因为它涵盖了所有实际情况的 99%。而且你问的是相当独特的。
  • 完美运行!对于像我这样对使用“排除”感到困惑的人来说,这是一种用于访问我们未能成功插入 postgresql.org/docs/current/sql-insert.html 的行的 postgres 语法
猜你喜欢
  • 2018-08-02
  • 2023-02-04
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2017-03-12
相关资源
最近更新 更多