Запись вывода SQL-запроса в файл - PullRequest
0 голосов
/ 14 октября 2011

У меня есть запрос SQL:

SELECT 'DROP TABLE ' || tablename
  FROM pg_catalog.pg_tables where tablename like 'r_395%';

чей вывод это:

?column?      
--------------------
 DROP TABLE r_395_0
 DROP TABLE r_395_1
 DROP TABLE r_395_2
 DROP TABLE r_395_3
 DROP TABLE r_395_4
 DROP TABLE r_395_5
 DROP TABLE r_395_6
 DROP TABLE r_395_7
 DROP TABLE r_395_8
 DROP TABLE r_395_9
(10 rows)

Я использую диспетчер сущностей для выполнения этого запроса:

StringBuffer query = new StringBuffer();

query.append("SELECT 'DROP TABLE ' || tablename
                FROM pg_catalog.pg_tables where tablename like 'r_395%'");            
entityManager.createNativeQuery(query.toString()).executeUpdate();

Я хочу записать этот вывод в файл. Если бы это был просто текстовый файл, я бы использовал filewriter и буферный писатель. Но теперь это файл, сгенерированный SQL, я немного запутался. Есть ли способ достичь этого в Java?

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Очень похожим решением для использования SQL COPY (см. Ответ Эрвина Брандштеттера) является использование метакоманды psql \copy. Разница здесь в том, что вам не нужен локальный доступ к базе данных. Вывод SQL COPY может быть записан только в то место в окне базы данных, где системный пользователь postgres имеет доступ для записи. С помощью psql \ copy вы можете записать вывод в местоположение на клиенте.

Подключиться к базе данных с помощью psql и выполнить команду

psql -h host -p port -U user database
\copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'

Или передать команду напрямую в psql с параметром -c:

psql -h host -p port -U user -c "\copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'" database

НТН

2 голосов
/ 14 октября 2011

Если вы хотите записать файл локально (на компьютере базы данных), есть также очень быстрый и простой COPY для случая, подобного этому:

COPY $$SELECT 'DROP TABLE ' || tablename
         FROM pg_catalog.pg_tables
        WHERE tablename ~~ 'r_395%'$$ TO /path/to/myfile;

Я использую цитирование доллара здесь, чтобы избежать экранирования одинарных кавычек.

...