Как я могу отбросить все таблицы в PostgreSQL, работая из командной строки?
Я не хочу отбрасывать саму базу данных, только все таблицы и все данные в них.
postgresql
AP257
источник
источник
public
, вы теряете все установленные расширения.Ответы:
Если все ваши таблицы находятся в одной схеме, этот подход может работать (код ниже предполагает, что имя вашей схемы
public
)Если вы используете PostgreSQL 9.3 или более поздней версии, вам также может потребоваться восстановить права по умолчанию.
источник
pg_
), поскольку они находятся в другой схемеpg_catalog
.GRANT ALL ON SCHEMA public TO public;
после создания.GRANT ALL
после создания?Вы можете написать запрос для генерации сценария SQL следующим образом:
Или:
В случае, если некоторые таблицы автоматически отбрасываются из-за каскадной опции в предыдущем предложении.
Кроме того, как указано в комментариях, вы можете отфильтровать таблицы, которые вы хотите удалить по имени схемы:
А затем запустите его.
Славная КОПИЯ + ПАСТА также будет работать.
источник
drop schema public cascade;
, но у вас почти всегда есть права на удаление таблиц.Наиболее приемлемый ответ на момент написания статьи (январь 2014 г.):
Это работает, однако если ваше намерение состоит в том, чтобы восстановить общедоступную схему в ее первоначальное состояние, это не полностью решит задачу. В pgAdmin III для PostgreSQL 9.3.1, если вы нажмете на «публичную» схему, созданную таким образом, и посмотрите на «панель SQL», вы увидите следующее:
Однако, напротив, новая база данных будет иметь следующее:
Для меня я использую веб-фреймворк Python, который создает таблицы базы данных (web2py), используя ранее вызванные проблемы:
На мой взгляд, полностью правильный ответ:
Также обратите внимание, что для выдачи этих команд в pgAdmin III, я использовал инструмент Query (значок лупы «Выполнение запросов SQL»), или вы можете использовать Plugins-> PSQL Console
Запись
Если у вас установлены какие-либо расширения, они будут отброшены при удалении схемы, поэтому вы должны записать, что вам нужно установить, а затем выполнить инструкции по мере необходимости. Например
CREATE EXTENSION postgis;
источник
drop
тогдаcreate
) использовалось для работы с PostgreSQL 9.1. После обновления до 9.3 необходимы два дополнительныхgrant
.Вы можете удалить все таблицы с
ИМО это лучше, чем
drop schema public
, потому что вам не нужно воссоздаватьschema
и восстанавливать все гранты.Дополнительный бонус в том, что для этого не требуется внешний язык сценариев или копирование-вставка сгенерированного SQL обратно в интерпретатор
источник
drop schema
хитрость, поскольку пользователь не был владельцем схемы, только таблиц. Этот работал, хотя :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
следующим образом:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Если все, что вы хотите удалить, принадлежит одному и тому же пользователю, то вы можете использовать:
Это отбросит все, что принадлежит пользователю.
Это включает в себя материализованные представления, представления, последовательности, триггеры, схемы, функции, типы, агрегаты, операторы, домены и т. Д. (Так, действительно: все ), которым
the_user
принадлежит (= создан).Вы должны заменить
the_user
действительное имя пользователя, в настоящее время нет возможности отбросить все для «текущего пользователя». В следующей версии 9.5 будет опцияdrop owned by current_user
.Более подробная информация в руководстве: http://www.postgresql.org/docs/current/static/sql-drop-owned.html
источник
public
схема принадлежатpostgres
, но все остальное принадлежит определенному пользователю, поэтому удаление всего принадлежащего этому пользователю очищает базу данных, за исключением схемы.В соответствии с Пабло выше, чтобы просто отказаться от конкретной схемы, в отношении случая:
источник
where schemaname='public'
часть значима?должен сделать свое дело.
источник
CREATE SCHEMA public;
. Также см. Stackoverflow.com/a/14286370 для получения дополнительной информацииВслед за Пабло и LenW, вот одна строка, которая делает все это и подготовку, и затем выполнение:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
NB: либо установите, либо замените,
$PGUSER
и$PGDB
значения, которые вы хотитеисточник
Если у вас есть PL / PGSQL процедурный язык установлен вы можете использовать следующую команду, чтобы удалить все без оболочки / Perl внешнего скрипта.
Вместо того, чтобы вводить это в приглашении "psql", я бы посоветовал вам скопировать его в файл и затем передать этот файл в качестве ввода в psql, используя опции "--file" или "-f":
Кредит, где кредит должен: я написал функцию, но думаю, что запросы (или, по крайней мере, первый) пришли от кого-то из одного из списков рассылки pgsql несколько лет назад. Не помню точно, когда или какой.
источник
Если вы все равно хотите уничтожить все таблицы, вы можете обойтись без таких тонких вещей, как CASCADE, поместив все таблицы в один оператор. Это также ускоряет выполнение.
Выполнение этого напрямую:
Заменить
TRUNCATE
с ,DROP
как это применимо.источник
public
схемой, не забудьте включить имя схемы в выражение:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
вместо простой передачи имен таблиц.Я немного изменил ответ Пабло для удобства возврата сгенерированных команд SQL в виде одной строки:
источник
Используйте этот скрипт в pgAdmin:
источник
На всякий случай ... Простой скрипт на Python, который очищает базу данных Postgresql
Удостоверьтесь, что после копирования это отступ правильно, так как Python полагается на него.
источник
Вы можете использовать функцию string_agg, чтобы создать разделенный запятыми список, идеально подходящий для DROP TABLE. Из скрипта bash:
источник
Это действительно интересный вопрос, и вы решите его несколькими способами. Я надеюсь, что это будет полезно для вас.
Здесь, в общем, у нас есть
public
схема по умолчанию. Итак, я использую это как пример.Если вы используете PostgreSQL 9.3 или более поздней версии, вам также может потребоваться восстановить права по умолчанию.
Это очистит всю схему и заново создаст ее как новую.
Вы потеряете другие объекты тоже , как
Functions
,Views
,Materialized views
и т.д.PostgreSQL хранит все таблицы в своей таблице записей с именем
pg_table
.Как видите, с помощью подзапроса мы можем удалить все таблицы из схемы.
Когда другие объекты данных Важны, и вы просто хотите удалить только таблицы из схемы, этот подход действительно будет вам полезен.
источник
Если вы хотите удалить данные (не удалить таблицу):
Или, если вы хотите удалить таблицу, вы можете использовать этот sql:
источник
Примечание: мой ответ - действительно удалить таблицы и другие объекты базы данных; для удаления всех данных в таблицах, т. е. усечения всех таблиц , Endre Both предоставил аналогично хорошо выполненный оператор (непосредственное выполнение) месяцем позже.
Для тех случаев , когда вы можете не только
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
или что - то, вот автономный SQL скрипт я написал, что сделка безопасным (т.е. вы можете поместить его междуBEGIN;
и илиROLLBACK;
к просто проверить это илиCOMMIT;
на самом деле делать дело) и очищает «все» объекты базы данных… ну, все те, которые используются в базе данных, которую использует наше приложение, или я мог бы разумно добавить, что:CHECK
,UNIQUE
)VIEW
s (нормальный или материализованный)public
внутренние или DB-внутренние), которыми владеем «мы»: сценарий полезен, когда выполняется как «не суперпользователь базы данных»; суперпользователь может отбросить все схемы (хотя действительно важные из них явно исключены)Не исключены (некоторые преднамеренные; некоторые только потому, что у меня нет примера в нашей БД):
public
схемы (например , для расширения предоставленного материала в них)Это действительно полезно в тех случаях, когда дамп, который вы хотите восстановить, имеет другую версию схемы базы данных (например, с Debian
dbconfig-common
, Flyway или Liquibase / DB-Manul), чем база данных, в которую вы хотите восстановить ее.У меня также есть версия, которая удаляет «все, кроме двух таблиц и того, что им принадлежит» (последовательность, проверенная вручную, извините, я знаю, скучно), если кто-то заинтересован; разница маленькая. Свяжитесь со мной или проверьте этот репо, если интересно.
SQL
Протестировано, за исключением более поздних дополнений (
extensions
предоставленных Clément Prévost ), на PostgreSQL 9.6 (jessie-backports
). Удаление агрегатов проверено на 9.6 и 12.2, процедура удаления также проверена на 12.2. Исправления и дальнейшие улучшения приветствуются!источник
DROP FUNCTION
не выполняется для процедуры и наоборот. Я изменил раздел функций так:AND pp.prokind ='f' -- Function
илиAND pp.prokind ='p' -- Procedure
proisagg
) на ≤ 10.x и агрегатов и процедур (prokind
) на ≥ 11 (проверено динамически) и протестировал оба - спасибо за подсказку.Вам нужно отбросить таблицы и последовательности, вот что сработало для меня
Перед выполнением команды вам может понадобиться SUDO / су на
postgres
пользователя или (экспорт соединения деталейPGHOST
,PGPORT
,PGUSER
иPGPASSWORD
) , а затемexport PGDATABASE=yourdatabase
источник
Задача Rake для Rails для уничтожения всех таблиц в текущей базе данных
источник
rake db:create
я запускаю его. Вы можете сделать Steve наконечник и удалить кодtable_name =
и изменения", "
для","
и#{ tables }
Ф.О.#{tables}
Следующие шаги могут быть полезны (для пользователей Linux):
Сначала введите в
postgres
командной строке следующую команду:Введите базу данных этой командой (мое имя базы данных:)
maoss
:Теперь введите команду для удаления всех таблиц:
источник
Я улучшил метод bash от jamie, позаботившись о представлениях, потому что он учитывает только тип таблицы «базовая таблица», который используется по умолчанию.
следующий код Bash сначала удаляет представления, а затем все остальные
источник
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
в командном файле Windows:
источник
ну, так как мне нравится работать из командной строки ...
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
затем используется для добавления префикса adrop table
и суффикса к;
разделителю команд.| egrep '_d_'
- Добавьте ещеgrep
немного, и вы можете быть более разборчивы в том, какие таблицы вы бросаете.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Примечание: как написано, это сгенерирует фиктивные строки для
\dt
вывода команд заголовков столбцов и итоговых строк в конце. Я избегаю этого путаницей, но вы можете использоватьhead
иtail
.источник
Самый простой способ - удалить общедоступную схему, как предлагали другие в предыдущих ответах. Тем не менее, это НЕ хороший способ. Вы никогда не знаете, что было сделано с публичной схемой, которая с тех пор была забыта и не была задокументирована. Вы также не знаете, будет ли это работать в будущем. В V9 это было бы нормально, но в V10 все ваши пользователи потеряли бы доступ к схеме, и им необходимо было бы снова предоставить доступ, иначе ваше приложение сломается. Я не проверял V11, но дело в том, что вы никогда не знаете, что сломается при переходе с компьютера на компьютер, с сайта на сайт или с версии на версию. Этого также нельзя сделать, если вы являетесь пользователем, который имеет доступ к базе данных, но не к схеме.
Если вам нужно сделать это программно, то другие ответы выше покрывают это, но одна вещь, которую ответы выше не учитывают, - это заставить Postgres выполнить эту работу за вас. Если вы используете pg_dump с опцией -c, как показано ниже:
Это создаст скрипт восстановления БД с инструкциями sql, который удалит все таблицы.
Если единственная цель при задании вопроса состояла в том, чтобы удалить таблицы перед восстановлением, то ваше восстановление сделает всю работу за вас.
Однако, если вам это нужно для чего-то другого, вы можете просто скопировать операторы drop из сценария sql.
источник