Запись вывода SQL-запроса в файл
У меня есть запрос 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 ответа
Если вы хотите записать файл локально (на машине базы данных), есть также очень быстрый и простой COPY
для такого случая:
COPY $$SELECT 'DROP TABLE ' || tablename
FROM pg_catalog.pg_tables
WHERE tablename ~~ 'r_395%'$$ TO /path/to/myfile;
Я использую котировки долларов здесь, чтобы избежать экранирования одинарных кавычек.
Очень похожим решением для использования 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
НТН