insert on conflict do update使用pg promise helpers进行多行插入/更新

s8vozzvw  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(352)

我正在尝试使用pgpromise向pgsql数据库插入多行。在我的例子中,表中可能已经存在一些我试图插入的记录。在这种情况下,我需要更新它们。通过浏览pgpromise官方文档,我发现可以使用helpers插入或更新多个行。除了多个插入/更新之外,还有什么方法可以像下面这样做吗?

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

643ylb081#

在某处创建静态变量:

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']});

请参见columnset和assigncolumns。
在下面的例子中,我们假设 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。

相关问题