Use the helpers生成查询的方法:
const skipIfNull = name => ({name, skip: c => c.value === null});
const cs = new pgp.helpers.ColumnSet([
'?id',
skipIfNull('name'),
skipIfNull('age'),
skipIfNull('type')
], {table: 'table'});
查看类型列集 and Column.
从示例生成查询data
:
const data = {
id: 1,
name: null, // will be skipped
age: 123,
type: 'tt'
};
const query = pgp.helpers.insert(data, cs) + ' ON CONFLICT(id) DO UPDATE SET ' +
pgp.helpers.sets(data, cs) + ' RETURNING *';
将生成:
INSERT INTO "table"("id","name","age","type") VALUES(1,null,123,'tt')
ON CONFLICT(id) DO UPDATE SET "age"=123,"type"='tt' RETURNING *
UPDATE:新语法通过分配列比sets
方法。
但请注意,按照方法setAPI,如果所有条件列都是,它将返回一个空字符串null
,因此生成的查询将无效。您需要为此添加一个检查;)
此外,考虑到您正在生成多插入,可以仅生成一个多行插入,从而提供更好的性能。为此请参阅使用 pg-promise 进行多行插入.
也可以看看: