Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在复制和pg查询流中使用占位符_Javascript_Node.js_Postgresql_Pg Promise - Fatal编程技术网

Javascript 在复制和pg查询流中使用占位符

Javascript 在复制和pg查询流中使用占位符,javascript,node.js,postgresql,pg-promise,Javascript,Node.js,Postgresql,Pg Promise,我正在尝试将查询提取为csv文件。我尝试使用copy with pg query stream执行查询,但遇到以下错误: 错误:bind消息提供1个参数,但准备好的语句需要0 当从查询中删除副本时,它可以与占位符一起工作。如果我提供了一个带有副本而没有占位符的查询,它也可以工作 const pgp = require('pg-promise') const QueryStream = require('pg-query-stream') query1 = "copy (select *

我正在尝试将查询提取为csv文件。我尝试使用copy with pg query stream执行查询,但遇到以下错误:

错误:bind消息提供1个参数,但准备好的语句需要0

当从查询中删除副本时,它可以与占位符一起工作。如果我提供了一个带有副本而没有占位符的查询,它也可以工作

const pgp = require('pg-promise')
const QueryStream = require('pg-query-stream')
query1 = "copy (select * from real_state WHERE town_code= $1 ) TO  '/tmp/file.csv'"
const qs = new QueryStream(query1, [22])
await db.stream(qs, s => {
            // initiate streaming into the console:
            s.pipe(JSONStream.stringify()).pipe(process.stdout)
        }).then(data => {
        }).catch(error => {
            console.log('ERROR:', error)
        })

我认为你把两个特征混在一起了

pg query stream将行作为流返回,不需要在select there中使用copy。只需使用一个简单的选择,然后通过管道将结果传输到文件流

常量fs=需要“fs” const{Pool}=require'pg' const QueryStream=require'pg-query-stream' const query=new QueryStreamselect*from real_state WHERE town_code=$1,[22] const stream=pool.queryquery const fileStream=fs.createReadStream'/tmp/file.csv' fileStream.pipestream 如果要使用复制,请使用pg复制流:

常量fs=需要“fs” const{Pool}=require'pg' const copyFrom=需要“pg-copy-streams”。从 const stream=db.querycopyFrom'COPY real_state FROM stdin WHERE town_code=$1',[22] const fileStream=fs.createReadStream'/tmp/file.csv' fileStream.pipestream
复制上下文中有一个限制,禁止您使用任何参数

但您可以通过使用pg promise查询格式绕过该限制:

const query=pgp.as.format'COPYSELECT*FROM real_state WHERE town_code=$1至$2', [22',/tmp/file.csv'];
他的代码可以很好地工作,使用我提供的work around查看我的答案。是的,但是当您已经有一个流时,使用copy有什么意义呢?看来你的工作只是想强迫他使用你的模块?强迫他使用我的模块这听起来很消极。如果你读了这个问题,他已经在使用它了,我给了他正确的解决方案,他所描述的问题。但不管出于什么原因,请随意引导他离开,开始使用不同的模块。是的,结果是否定的,他已经在使用它了。我的错,我的道歉。
query1 = "copy (select * from real_state WHERE town_code= $1 ) TO  '/tmp/file.csv'" ==> error
query2 = "copy (select * from real_state) TO  '/tmp/file.csv'" ==> It works
query3 = "select * from real_state WHERE town_code= $1" ==>  It works