我在PostgreSQL中有一个upsert查询,比如:

INSERT INTO table
  (id, name)
values
  (1, 'Gabbar')
ON CONFLICT (id) DO UPDATE SET
  name = 'Gabbar'
WHERE
  table.id = 1

我需要用knex来完成这个向上插入的查询.怎么办?

推荐答案

所以我用Dotnil's answer on Knex Issues Page的建议解决了这个问题:

var data = {id: 1, name: 'Gabbar'};
var insert = knex('table').insert(data);
var dataClone = {id: 1, name: 'Gabbar'};

delete dataClone.id;

var update = knex('table').update(dataClone).whereRaw('table.id = ' + data.id);
var query = `${ insert.toString() } ON CONFLICT (id) DO UPDATE SET ${ update.toString().replace(/^update\s.*\sset\s/i, '') }`;

return knex.raw(query)
.then(function(dbRes){
  // stuff
});

希望这对别人有帮助.

Postgresql相关问答推荐

无法从Docker迁移Golang上的两个不同服务到一个数据库'

端口5432失败:致命:数据库xxx&不存在.在PostgreSQL数据库中

在PostgreSQL中,`MY_VARIABLE IN(<;Long_ARRAY_of_Items>;)`何时是FAST?

有没有一种方法可以在参数中添加密码,并在批处理文件中需要时自动获取密码?

返回行值和行计数的总和

当我写 SELECT ~1;在 Postgresql 上它给了我 -2 结果.这是什么原因?它一直持续〜4和-5等

heroku、postgreSQL、django、comments、tastepie:没有运算符匹配给定的名称和参数类型

PostgreSQL - jsonb_each

Postgres COPY FROM csv file-No such file or directory

PostgreSQL ,从 2 个表中 Select ,但仅从表 2 中 Select 最新的元素

PostgreSQL INSERT 插入一个枚举数组

带有 postgres 的 DOCKER 容器,警告:could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted

如何使 Java 和 Postgres 枚举一起工作以进行更新?

是否可以在 PostgreSQL 中部分刷新materialized视图?

如何判断每个组中是否存在值

如何在 PostgreSQL 中创建 guid

manage.py 迁移时必须是关系 django_site 的所有者

使用 RPostgreSQL 写入特定模式

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

如何使用 PostgreSQL 在任何列中查找所有具有 NULL 值的行