javascript - 在 Node API 混淆中使用 knex.js 编写插入语句

标签 javascript node.js postgresql knex.js

我有一个问题,我似乎无法真正解决。它非常特定于 Knex.JS 实现,我确信与 PostgreSQL 无关。

以下实现有效。插入适量时(~500 条语句)。由于其他原因,在较大的数量上失败。无论如何,以下内容不适用于我的用例,我需要类似于下一节的内容。

import knex = require("knex");
(function (items) {
  let db = knex.table("items");

  db.truncate();

  let foo = [];
  items.forEach(function(item) {
    foo.push({
       id : item.id,
       item_data : JSON.stringify(item)
    });
  });

  db.insert(foo).then(function () { /*..*/ });

}(items))

但以下不是:

import knex = require("knex");
(function (items) {
  let db = knex.table("items");

  db.truncate();

  let foo = [];
  items.forEach(function(item) {
    db.then(function() {
        return db.insert(foo).into("items");
    });
  });

  db.then(function () { console.log("Done"); });

}(items))

这是行不通的:

  • 插入的行数不一致。在某些实现中,它比我拥有的元素多得多 (?!)
  • 我在这个实现中遇到了很多重复的键错误,因为我有一个唯一的约束

附加信息:

  • 该集合不包含重复键
  • 我使用 PostgreSQL 作为后端

问题主要是如何实现所需的行为。理想的情况是处理 500 个“项目”的 block 。我已经针对项目 ( https://github.com/tgriesser/knex/issues/826 ) 发布了一个问题,但我希望 Knex.JS 社区的一些人在这里更加活跃。

最佳答案

您的解决方案是正确的( promise 链接),但是由于您使用的是 Knex,它随 Bluebird 一起提供,它已经为此提供了一个实用方法:

var Promise = require("bluebird"); // also used internally by Knex so free to require

Promise.each(items, db.insert.bind(db)); 

会做同样的事情:

items.forEach(function(item) {
  chain = chain.then(function () {
     return db.insert(item);
  });
});

关于javascript - 在 Node API 混淆中使用 knex.js 编写插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332046/

相关文章:

javascript - 使用Jquery获取被点击的item attr

javascript - 未找到元素

postgresql - 将数据库从 Heroku 迁移到 AWS

python - 如何在 alembic upgrade head 中运行升级后代码

javascript - 如何禁用具有顺序 ID 的多个单选按钮?

javascript - Passport 认证后无法找回用户

node.js - Mocha + SeleniumJS + PhantomJS 检索超时

javascript - 使用 Mysqljs\mysql 执行 'where in' 语句

postgresql - 如何连接两列

javascript - 使用 Node js 检查 (Windows) 文件夹权限