Как экспортировать данные из Postgresql в CSV-файл с помощью JDBC?

1

Я хочу экспортировать данные в таблицу по дате, поэтому я пишу 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"?

  • 0
    jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/...
  • 0
    Вам может помочь следующая ссылка: stackoverflow.com/questions/1517635/…
Показать ещё 2 комментария
Теги:
jdbc

2 ответа

2
Лучший ответ

Ошибка показывает ERROR: должен быть суперпользователем в COPY в файл или из файла

Кажется, что текущий пользователь не имеет достаточных разрешений для записи файла. Предоставьте разрешения для места записи для пользователя или выполните программу из учетной записи пользователя, которая имеет достаточные права для записи в файл.

  • 0
    Я могу использовать \ copy для выполнения этого запроса вместо COPY без разрешения суперпользователя в командной строке, но в java-программе это недопустимый escape-символ при использовании «\ copy», но когда я пытаюсь «скопировать с двойной косой чертой», возникает синтаксическая ошибка в исключении postgresql. Поэтому мне интересно, если какой-либо метод может решить эту проблему ..
  • 0
    @ Ченлу, пожалуйста, посмотрите мой метод, который я добавил в качестве ответа.
8

Для этого я бы рекомендовал использовать 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

  • 0
    Как получить имя столбца из базы данных?
  • 1
    @PenaPintada stackoverflow.com/questions/1054984/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню