在 JDBC 中将 postgresql 表导出为 CSV 的问题

Posted

技术标签:

【中文标题】在 JDBC 中将 postgresql 表导出为 CSV 的问题【英文标题】:Issue with exporting portgresql table to CSV in JDBC 【发布时间】:2012-03-02 09:25:18 【问题描述】:

我正在使用 postgresql 来托管我的数据库。在我的数据库中,我有一个表 xyz,其结构如下所示

id    content    folder
1     hello      Inbox
2     hi         Sent

我想使用我的 java 程序将此表导出为 CSV。下面是代码sn-p

Connection connection2  = new ServerDBConnect().getConnection();
PreparedStatement statement = connection2.prepareStatement("copy (SELECT * FROM xyz WHERE folder=? ) to 'C:/export.csv' delimiter ','");
statement.setString(1, FOLDER_SELECTED); //Here, FOLDER_SELECTED=Inbox
statement.execute();

当我执行这段代码时,我得到SQLException

ERROR: there is no parameter $1

如果我在没有指定文件夹的情况下执行代码 ("copy (SELECT * FROM xyz) to 'C:/export.csv' delimiter ','")),则代码可以正常工作。

我在这里做错了什么?如何解决这个问题?

注意:如果我直接在 Postgresql SQL 控制台中执行查询 (copy (SELECT * FROM xyz WHERE folder='Inbox' ORDER BY time) to 'G:/export.csv' delimiter ','),我会得到所需的输出。

请帮忙

【问题讨论】:

不确定这个问题是否与您相关:***.com/questions/5726362/… @AndreaPolci:谢谢,但该链接与我无关。我正在尝试将本地数据库中表的内容导出到本地系统 看起来与我相关。该链接指向一个询问如何从 JDBC 使用 copy 的问题。 @skaffman:使用copy 对我来说不是问题,但我无法在查询中指定过滤器(folder='Inbox' 您并没有真正在准备好的语句中使用 sql 语句,您正在使用一些 psql 命令。我很惊讶它甚至可以在没有绑定的情况下工作。我相信正确的方法是使用 CopyManager,如此链接 ***.com/questions/6958965/… 所示(我认为其他 cmets 是相关的 :) 【参考方案1】:

我终于自己找到了答案。

查询中的小改动给了我想要的结果

查询应该是这样的

Connection connection2  = new ServerDBConnect().getConnection();
PreparedStatement statement = connection2.prepareStatement("copy (SELECT * FROM xyz WHERE folder='" + FOLDER_SELECTED + "' ) to 'C:/export.csv' delimiter ','");

这让我发疯了,但终于完成了:-)

【讨论】:

我知道这是一个老问题,但对于未来的读者:只有当FOLDER_SELECTED 来自受信任的来源时才这样做。否则,您将容易受到 SQL 注入的攻击。

以上是关于在 JDBC 中将 postgresql 表导出为 CSV 的问题的主要内容,如果未能解决你的问题,请参考以下文章

HHH000231:模式导出不成功:java.sql.SQLException:找不到适合 jdbc:postgresql 的驱动程序

在 Rails 中将 2 个表导出为 CSV [如何选择特定列?]

使用 pgAdmin 导出 Postgresql 表数据

在 google chrome 浏览器中将 HTML 表导出为 csv

如何在 Postgresql 上将表格导出为带有标题的 CSV?

如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?