如何从NodeJS中的stdin响应中获取Vertica副本?

时间:2014-11-25 12:40:26

标签: node.js stdin vertica

我使用的是Vertica数据库07.01.0100和node.js v0.10.32。我正在使用vertica nodejs module by vanberger。我想从stdin命令发送一个副本,这是使用这个例子:https://gist.github.com/soldair/5168249。这是我的代码:

        var loadStreamQuery = "COPY \""+input('table-name')+"\" FROM STDIN DELIMITER ',' skip 1 direct;"
        var stream = through();
        connection.copy(loadStreamQuery,function(transfer, success, fail){
            stream.on('data',function(data){
                log.info("loaddata: on data =>",data);
                transfer(data);
            });

            stream.on('end',function(data){
                log.info("loaddata: on end =>", data);
                if(data) {
                    transfer(data);                     
                }
                success();
                callback(null,{'result':{'status':'200','result':"Data was loaded successfully into Vertica"}});
            });
            stream.on('error',function(err){
                fail();
                log.error("loaddata: on error =>",err);
                connection.disconnect();
            });
            stream.write(new Buffer(file));
            stream.end();
        }
        );

但是,如果数据文件的列数多于目标表,则不会这样说。它只是愉快地运行,没有复制然后结束。当我看着桌子时,什么都没有加载。如果我在dbvisualizer中执行相同的操作,它会告诉我0行受到影响。

我想检查命令的状态,但我不知道如何。还有其他一些我需要倾听的事件吗?我是否需要将复制结果保存到变量并在那里监听,就像我对查询调用一样?我是一个节点菜鸟,所以如果答案很明显,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:1)

我并不认为它是node.js的东西,而是Vertica的东西。

您需要查找被拒绝的行。您可以在文档here中找到一些很好的示例。

如果要实际查看拒绝的行,可以使用COPY语句子句REJECTED DATA AS table "loader_rejects"来执行此操作。或者,您可以将其发送到群集上的文件。我不知道使用STDIN将被拒绝的行放到本地文件的方法。

如果您根本不关心实际数据,只想知道加载和拒绝了多少行......您可以使用GET_NUM_REJECTED_ROWS()GET_NUM_ACCEPTED_ROWS()。我认为COPY实际上也会返回一个只包含已加载行数的结果集,至少这是我过去注意到的。

所以我想作为一个例子,如果你想看看接受和拒绝了多少行,你可以这样做:

connection.query "SELECT GET_NUM_REJECTED_ROWS() AS REJECTED_ROWS, GET_NUMBER_ACCEPTED_ROWS() AS ACCEPTED_ROWS", (err, resultset) -> log.info( err, resultset.fields, resultset.rows, resultset.status )