Удалите все таблицы в postgresql, используя скрипт bash - PullRequest
2 голосов
/ 14 октября 2011

Я начинающий пользователь bash-скрипта.Я пытаюсь выполнить эту команду postgresql (которая выводит команды для удаления таблиц, чье имя похоже на r_395)

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)

с использованием bash с этой командой:

/bin/su - postgres -c "/usr/bin/psql database -c SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables where tablename like 'r_395%'" > droptables

Но я получаю эту ошибку:

psql: FATAL:  role "DROP TABLE " does not exist
-bash: tablename: command not found

Что я делаю не так?

1 Ответ

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

Вероятно, из-за того, что цитаты переосмысливаются при включении -c.Вам нужно что-то вроде:

su - postgres -c "/usr/bin/psql database -c \"SELECT 'DROP TABLE ' || ....

т.е. вам нужно снова заключить аргумент arg в psql -c.

Это быстро превращается в беспорядок.Вместо этого я предлагаю вам получить команду, которую вы хотите, чтобы psql выполнил, в качестве выходных данных, а затем просто заставить psql выполнить stdin (вообще не передавая -c).Это позволяет избежать кавычек и упрощает тестирование (просто выведите канал для psql, и вы увидите, что он получит).То есть:

echo "SELECT 'DROP TABLE ' || tablename ... " | su - postgres -c "psql database"

или используйте «здесь документ»:

su - postgres -c "psql database" <<EOF
SELECT 'DROP TABLE ' || tablename ...
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...