【问题标题】:Escaping Backslash using Knex.raw for \Copy command in Postgres在 Postgres 中使用 Knex.raw 为 \Copy 命令转义反斜杠
【发布时间】:2014-11-21 03:46:46
【问题描述】:

我们试图在 Knex.raw 中使用 \COPY 命令。我们通过 heroku/postgres 连接,\COPY 是批量导入数据的唯一方法,因为我们没有超级用户权限。副本前的反斜杠将被删除或倍增,具体取决于您的尝试。

到目前为止,我们已经尝试使用 1.\b 2.\ 3. String.fromCharCode(92) 4. 串联

我们正在使用的完整功能是......

knex.raw("\COPY tablename (column1, column2, ...columnN) FROM STDIN " + csvValues).then(function(response){
console.log('the response from the copy', response);

});

我们已经在我们的 pg:psql 环境中测试了这个确切的函数,它运行良好。如果您知道更好的方法,请告诉我们!

问候, 布兰登

【问题讨论】:

  • khampson 是对的 \copy 不是 SQL 命令。我不知道 knex,但也许您可以使用 copy .. from stdin 并通过流发送数据(JDBC 驱动程序有一个特殊的类来支持这一点)。不知道这是否可以通过 JavaScript 实现

标签: postgresql heroku knex.js


【解决方案1】:

\copy 是一个psql(客户端)命令,它包装了PostgresCOPY(服务器)。听起来您可能正在尝试将两者结合起来,这就是问题所在。

由于 knex.js 是一个查询构建器,它不会知道 \copy -- \COPY 将无效 SQL 在客户端中使用场景。

您提到您没有超级用户 访问权限,如果您想引用文件,COPY 需要该访问权限。

如果您因此无法使用COPY,则需要使用psql 并利用其\copy 命令,knex.js 可能不是要使用的工具。相反,您需要通过调用 shell 命令来访问它。

也许这批数据的导入可以完全在 Javascript 之外完成?即通过直接使用 psqlbash 脚本?

【讨论】:

  • 坎普森,感谢您的回复。根据我对这个问题的理解,我认为 Knex 没有正确转义某些值 - 特别是在使用双斜杠时。我们向 Knex 提出了这个问题,他给了我们这个解决方法npmjs.org/package/pg-copy-streams。这就像批量导入我们的数据的魅力。
  • 啊,听起来 pg-copy-streams 本质上是 psql \copy 命令的包装器。
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
相关资源
最近更新 更多