【发布时间】:2018-04-12 00:22:46
【问题描述】:
我进行了广泛的搜索,但无法解决这个简单的问题。 我在 nodejs 中编程,并使用 pg-promise 将我的 JSON 文件动态存储到 postgres 9.4.11 数据库中(我不允许升级数据库)。 我的 JSON 每个包含大约一百列,并且我已将其正确解析为三个对象。 1.字段 2. 栏目 3. 表 当我这样做时,Pg-promise 完美地工作:
//-- connection details would be up here const db = pgp (conn);--
//Insert statement is below
for (var i=0; i<Object.keys(fields).length; i++){
const data = [fields[i]];
const cs = new pgp.helpers.ColumnSet(columns[i]);
const table = new pgp.helpers.TableName(tables[i],"public");
const insert = pgp.helpers.insert(data,cs,table);
db.none(insert)
.then(data => {
console.log("Success! Record inserted for " + table);
})
.catch(error => {
//error
console.log("ALERT!!! Something went wrong with Record in table " + table);
});
}
当然,我在 postgresql 9.4.11 上,我不能使用简单的:
const insert = pgp.helpers.insert(data,cs,table) + " ON CONFLICT (id1, uid2, xid3) DO NOTHING";
仅执行插入新项目,因为 UPSERTS 仅从 9.5 开始可用。
我的查询每次运行执行大约 2,000 行插入,我对此感到满意。
我在这方面还很陌生,我希望也许在我的谷歌搜索中我忽略了直接的解决方案。
我见过的最接近的解决方案是存储过程,但我不确定如何实现它。
拜托,stackoverflow,你可能是我唯一的希望!
我只是想确保在 id1、uid2 和 xid3 上匹配的每一行都不会插入到我的 postgres 数据库中。
【问题讨论】:
-
您的问题与
pg-promise无关。您只需根据您的 PostgreSQL 版本支持的UPSERT逻辑调整查询即可。为此,请参阅:How to UPSERT in PostgreSQL? -
@vitaly-t 感谢您的快速回复。所以是的,我看到了那篇文章,我想尝试指示的存储过程方法,创建一个临时表,但使用 pg-promise,我不知道如何。你是在建议,也许我不需要 Pg-promise 来实现我想要做的事情?
-
您需要更改的内容在
pg-promise之外,您只会使用它来执行查询;) -
为什么不使用 CTE (WITH) 查询(而不是存储过程),如下所述:stackoverflow.com/questions/39014190/…?
-
谢谢大家! :-) 花了一整天的时间,我无法让它工作。我会想出别的办法。也许我会查询数据库并存储匹配的 ID 并从 JSON 中加载不匹配的项目。
标签: node.js postgresql postgresql-9.4 upsert pg-promise