Я хочу экспортировать данные в таблицу по дате, поэтому я пишу java-программу, используя jdbc.
public void exportData(Connection conn,String filename) {
Statement stmt;
String query;
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
Date startDate = dateFormat.parse("2014-08-21 00:00:00");
Date endDate = dateFormat.parse("2014-08-22 00:00:00");
Calendar startCalendar = Calendar.getInstance();
startCalendar.setTime(startDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
Calendar thisDayCalendar = startCalendar;
while(!thisDayCalendar.after(endCalendar)){
Date thisDayDate = thisDayCalendar.getTime();
thisDayCalendar.add(Calendar.DATE, 1);
Date nextDayDate = thisDayCalendar.getTime();
String thisDayString = dateFormat.format(thisDayDate);
String nextDayString = dateFormat.format(nextDayDate);
SimpleDateFormat dateFormat1 = new SimpleDateFormat ("yyyy-MM-dd");
String fileDateString = dateFormat1.format(thisDayDate);
//For comma separated file
query ="COPY (SELECT * FROM signals WHERE date_time >= '" + thisDayString +
"' AND date_time < '" +nextDayString + "' ) TO " +filename + fileDateString + ".csv delimiter ','";
stmt.executeQuery(query);
//System.out.println(query);
}
} catch(Exception e) {
e.printStackTrace();
stmt = null;
}
}
Это программирование выполняется на сервере, а база данных - еще одна, я подключаюсь к базе данных в этой программе. Но когда я запускаю программу на сервере, я получил сообщение об ошибке, что только суперпользователь может копировать в файл или из файла:
org.postgresql.util.PSQLException: ERROR: must be superuser to COPY to or from a file
Hint: Anyone can COPY to stdout or from stdin. psql \copy command also works for anyone.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:560)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:283)
at DBase.exportData(ExportSignal.java:85)
at ExportSignal.main(ExportSignal.java:23)
Я искал решения в Интернете и пытался использовать команду psql '\ copy', но при компиляции другая ошибка говорит, что "\" является недопустимым escape-символом в java, поэтому я написал "двойные косые копии COPY", которые сделали синтаксическую ошибку при запуске программы.
query ="\COPY (SELECT * FROM signals WHERE date_time >= '" + thisDayString +
"' AND date_time < '" +nextDayString + "' ) TO " +filename + fileDateString + ".csv delimiter ','";
Доза, кто-нибудь знает, как заставить программу выполнить или решить проблему с недействительным escape-символом в "\ copy"?
Ошибка показывает ERROR: должен быть суперпользователем в COPY в файл или из файла
Кажется, что текущий пользователь не имеет достаточных разрешений для записи файла. Предоставьте разрешения для места записи для пользователя или выполните программу из учетной записи пользователя, которая имеет достаточные права для записи в файл.
Для этого я бы рекомендовал использовать CopyManager.
Connection connection = DriverManager.getConnection(url);
CopyManager copyManager = new CopyManager((BaseConnection) connection);
File file = new File("/tmp/output.csv");
FileOutputStream fileOutputStream = new FileOutputStream(file);
//and finally execute the COPY command to the file with this method:
copyManager.copyOut("COPY (" + query + ") TO STDOUT WITH (FORMAT CSV)", fileOutputStream);
Этот метод не требует, чтобы вы были суперпользователем и корректно форматировали выходной текст как CSV