使用复制 Postgres jdbc 的正确方法
Posted
技术标签:
【中文标题】使用复制 Postgres jdbc 的正确方法【英文标题】:Correct way to use copy Postgres jdbc 【发布时间】:2018-04-09 20:59:28 【问题描述】:无法对 jdbc Postgres 使用复制命令。下面的代码 sn-p 示例有什么问题。
public boolean loadReportToDB(String date)
// TODO Auto-generated method stub
Connection connection = DBUtil.getConnection("POSTGRESS");
String fileName = "C:/_0STUFF/NSE_DATA/nseoi_" + date + ".csv";
String sql = "\\copy fno_oi FROM 'C:\\_0STUFF\\NSE_DATA\\nseoi_27102017.csv' DELIMITER ',' CSV header";
try
PreparedStatement ps = connection.prepareStatement(sql);
System.out.println("query"+ps.toString());
int rowsaffected = ps.executeUpdate();
System.out.println("INT+" + rowsaffected);
return true;
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
return false;
org.postgresql.util.PSQLException: ERROR: syntax error at or near "\"
Position: 1
at org.
如果我们使用
String sql = "copy fno_oi FROM 'C:\\_0STUFF\\NSE_DATA\\nseoi_27102017.csv' DELIMITER ',' CSV header";
那么没有行被更新
postgres 版本 postgresql-10.0-1-windows-x64
【问题讨论】:
您不需要复制语句的 \\ in from。您遇到的错误是什么? 服务器上是否存在文件C:\\_0STUFF\\NSE_DATA\\nseoi_27102017.csv
?如果您手动测试语句,它会被加载吗?
postgres-# \copy fno_oi FROM 'C:_0STUFF\NSE_DATA\nseoi_27102017.csv' DELIMITER ',' CSV header COPY 212
同样的命令在 sql shell 中工作。
\copy
是 psql
命令 不是 SQL command 您需要使用 copy
代替:postgresql.org/docs/current/static/sql-copy.html 或使用 CopyManager API:jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/…
【参考方案1】:
由于您的输入文件本地存储在运行 Java 程序的计算机上,因此您需要在 JDBC 中使用 copy ... from stdin
的等效项,因为 copy
只能访问 服务器上的文件(运行 Postgres 的地方)。
为此,请使用 JDBC 驱动程序提供的 CopyManager
API。
类似的东西:
Connection connection = DBUtil.getConnection("POSTGRES");
String fileName = "C:/_0STUFF/NSE_DATA/nseoi_" + date + ".csv";
String sql = "copy fno_oi FROM stdin DELIMITER ',' CSV header";
BaseConnection pgcon = (BaseConnection)conection;
CopyManager mgr = new CopyManager(pgcon);
try
Reader in = new BufferedReader(new FileReader(new File(fileName)));
long rowsaffected = mgr.copyIn(sql, in);
System.out.println("Rows copied: " + rowsaffected);
catch (SQLException e)
e.printStackTrace();
【讨论】:
如果postgress服务器和应用服务器不同,推荐的方式是什么 @MrinalBhattacharjeeCopyManager
【参考方案2】:
这对我有用:
try (Connection conn = DriverManager.getConnection(connUrl, myUid, myPwd))
long rowsInserted = new CopyManager((BaseConnection) conn)
.copyIn(
"COPY table1 FROM STDIN (FORMAT csv, HEADER)",
new BufferedReader(new FileReader("C:/Users/gord/Desktop/testdata.csv"))
);
System.out.printf("%d row(s) inserted%n", rowsInserted);
使用copyIn(String sql, Reader from)
的好处是可以避免 PostgreSQL 服务器进程无法直接读取文件的问题,因为它缺少权限(例如读取我桌面上的文件)或者因为文件不是本地机器PostgreSQL 服务器正在运行。
【讨论】:
以上是关于使用复制 Postgres jdbc 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 JDBC 将 CSV 复制到具有自定义类型数组的 Postgres
Postgres 错误方法 org.postgresql.jdbc.PgConnection.createClob() 未实现