Как я могу отбросить все таблицы в базе данных PostgreSQL? - PullRequest
872 голосов
/ 25 июля 2010

Как мне удалить все таблицы в PostgreSQL, работая из командной строки?

Я не хочу удалить саму базу данных, только все таблицы и все данные в них.

Ответы [ 22 ]

0 голосов
/ 29 декабря 2018

Самый простой способ - удалить общедоступную схему, как предлагали другие в предыдущих ответах. Тем не менее, это НЕ хороший способ. Вы никогда не знаете, что было сделано с общедоступной схемой, которая с тех пор была забыта и не была задокументирована. Вы также не знаете, будет ли это работать в будущем. В V9 это было бы нормально, но в V10 все ваши пользователи потеряли бы доступ к схеме, и им необходимо было бы снова предоставить доступ, иначе ваше приложение сломается. Я не проверял V11, но дело в том, что вы никогда не знаете, что сломается при переходе с компьютера на компьютер, с сайта на сайт или с версии на версию. Этого также нельзя сделать, если вы являетесь пользователем, который имеет доступ к базе данных, но не к схеме.

Если вам нужно сделать это программно, то другие ответы выше покрывают это, но одна вещь, которую ответы выше не учитывают, - это заставить Postgres выполнить эту работу за вас. Если вы используете pg_dump с опцией -c, как показано ниже:

sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""

Это создаст скрипт восстановления БД с инструкциями sql, который удалит все таблицы.

Если единственная цель при задании вопроса состояла в том, чтобы удалить таблицы до восстановления, то ваше восстановление сделает всю работу за вас.

Однако, если вам это нужно для чего-то другого, вы можете просто скопировать операторы drop из сценария sql.

0 голосов
/ 17 апреля 2018

ну, так как мне нравится работать из командной строки ...

psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"

-c '\dt' вызовет команду списка таблиц.

List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser

cut -d ' ' -f 4 Теперь отправьте вывод, чтобы захватить 4-е поле (при использовании пробела в качестве разделителя), которое является таблицей.

sed затем используется для добавления префикса drop table и суффикса к разделителю команд ;.

| egrep '_d_' - добавьте в grep еще немного, и вы сможете более точно определить, какие таблицы вы отбрасываете.

drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;

Примечание: как написано, это сгенерирует фиктивные строки для вывода команд \dt заголовков столбцов и итоговых строк в конце. Я избегаю этого путаницей, но вы можете использовать head и tail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...