【问题标题】:Correct way to use copy Postgres jdbc使用复制 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

【问题讨论】:

标签: java postgresql jdbc 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服务器和应用服务器不同,推荐的方式是什么
  • @MrinalBhattacharjee CopyManager
【解决方案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 服务器正在运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    相关资源
    最近更新 更多