在 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 [如何选择特定列?]
在 google chrome 浏览器中将 HTML 表导出为 csv