Правильный способ использования копии Postgres jdbc
Невозможно использовать команду копирования с jdbc Postgres. Что не так с приведенным ниже примером фрагмента кода.
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
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.
Поскольку ваш входной файл хранится локально на компьютере, на котором запущена Java-программа, вам необходимо использовать эквивалент copy ... from stdin
в JDBC, потому что copy
может получить доступ только к файлам на сервере (где работает Postgres).
Для этого используйте CopyManager
API предоставляется драйвером JDBC.
Нечто подобное:
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();
}