在对象的数组上执行异步pg节点查询

时间:2013-12-16 15:13:45

标签: postgresql asynchronous underscore.js node-postgres

我有一个对象的数组,我需要迭代,并将每个项目插入到DB(postgres)中。我正在使用_.each来迭代数组。

arr = [ 
      {name: 'Aaron',    description: 'First'},
      {name: 'Brian',    description: 'Second'},
      {name: 'Chris',    description: 'Third'}
]

    var i = 0;
    _.each(array, function(lt){     
        var client = new pg.Client(self.getConnString());
        client.connect(function(err) {
            if (err) {
                          //doSomething//
            }
            var sql = 'insert into load_test (name,description) values(\''+lt.name+'\', \''+lt.description+'\')';
            console.log(i + " <- query: " + lt.name + " desc: " + lt.description);
            query = client.query(sql);
            query.on('end', client.end.bind(client));
            i++;
        });
    });//each

如何以每次查询执行异步的方式编写此函数(_each)?

由于

2 个答案:

答案 0 :(得分:0)

最后,解决方案如下所示:

self.InsertLT = function(index, callback){
        var client = new pg.Client(self.getConnString());
        if (index < arr.length){
            //console.log('index = ' + index);
            var sql = 'insert into table (name,description) values(\''+arr[index].name+'\', \''+arr[index].description+'\')';
            //console.log(sql);
            client.connect(function(err) {
                if (err) { 
                    logger.error(self.ERR_CONNECT_TO_DB + ' --> ' + err);
                    callback(-1);    
                }   
                client.query(sql, function(err, result){    
                    if (err){    
                        logger.error(self.ERR_RUNNING_QUERY + ' --> ' + err);    
                        callback(-1);    
                    }    
                    else{
                        client.end();
                        self.InsertLT(++index,callback);
                    }
                });//query
            });
        }
        else{
            callback();
        }

答案 1 :(得分:-2)

行。我想我明白你从哪里来的。

你想做三个我想说的改变。

  1. 在循环外创建连接(“client”)
  2. 使用参数化查询
  3. 在事务中包装插入(因此它们全部工作或全部失败)
  4. 我不做节点,但重新编写代码看起来像:

    arr = [ 
          {name: 'Aaron',    description: 'First'},
          {name: 'Brian',    description: 'Second'},
          {name: 'Chris',    description: 'Third'}
    ];
    
    var i = 0;
    var client = new pg.Client(self.getConnString());
    client.connect(function(err) {
        if (err) {
            //doSomething//
        }
        // I don't know how node does parameterised queries, but it will look
        // something like this
        var sql   = 'insert into load_test (name,description) values(?,?)';
        var query = client.query(sql);
        _.each(arr, function(lt) {
            console.log(i + " <- query: " + lt.name + " desc: " + lt.description);
            // There might be separate bind + excecute calls
            query.execute(lt.name, lt.description);
            i++;
        });
    // There might be a client.disconnect() needed here
    

    您需要查阅文档以获取正确的语法。

    通常,您在应用程序启动时连接并保持数据库连接,直到它退出。我猜你已经引用了某个闭包中仍然引用的数据库连接。如果您的查询需要“completed()”或“discard()”方法或类似方法,请确保将其调用以释放资源。