Мне регулярно нужно удалять все данные из моей базы данных PostgreSQL перед перестройкой. Как бы я сделал это прямо в SQL?
На данный момент мне удалось придумать оператор SQL, который возвращает все команды, которые мне нужно выполнить:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Но я не вижу способа выполнить их программно, как только они у меня есть.
DECLARE r RECORD;
тогда для цикла:FOR r IN SELECT tablename FROM pg_tables LOOP
Явные курсоры редко нужны в plpgsql. Используйте простой и быстрый неявный курсор в а
FOR
цикла:Примечание. Так как имена таблиц не являются уникальными для каждой базы данных, необходимо убедиться, что имена таблиц соответствуют схеме. Кроме того, я ограничиваю функцию схемой по умолчанию public. Приспосабливайтесь к своим потребностям, но обязательно исключите системные схемы
pg_*
иinformation_schema
.Будьте очень осторожны с этими функциями. Они обстреляли вашу базу данных. Я добавил устройство безопасности детей. Прокомментируйте
RAISE NOTICE
строку и раскомментируйте,EXECUTE
чтобы заправить бомбу ...format()
требуется Postgres 9.1 или более поздняя версия. В более старых версиях объединить строку запроса следующим образом:Одиночная команда, без цикла
Поскольку мы можем использовать
TRUNCATE
несколько таблиц одновременно, нам вообще не нужен курсор или цикл:Объедините все имена таблиц и выполните одну инструкцию. Проще, быстрее:
Вызов:
Уточненный запрос
Вам даже не нужна функция. В Postgres 9.0+ вы можете выполнять динамические команды в
DO
выражении. А в Postgres 9.5+ синтаксис может быть еще проще:О разнице между
pg_class
,pg_tables
иinformation_schema.tables
:О
regclass
и цитируемые имена таблиц:Для многократного использования
Создайте «шаблонную» базу данных (назовем ее
my_template
) с вашей ванильной структурой и всеми пустыми таблицами. Затем пройдитеDROP
/CREATE DATABASE
цикл:Это очень быстро , потому что Postgres копирует всю структуру на уровне файлов. Никаких проблем с параллелизмом или других накладных расходов, замедляющих вас.
Если одновременные соединения не дают вам сбросить БД, подумайте:
источник
DROP DATABASE mydb
, очевидно,). Может быть, вы путаете схемы с базами данных?DO
(как и любой другой оператор SQL) выполняется исключительно в текущей базе данных . Postgres не имеет доступа к другим базам данных в той же транзакции. Вы должны будете использовать dblink или FDW, чтобы сделать это. Но это действительно влияет на все схемы в текущей базе данных - если не добавить ,WHERE t.schemaname = 'public'
чтобы ограничить влияние на одной конкретной схемы в данном конкретном случае.Если мне нужно сделать это, я просто создам схему sql текущего db, затем перетащу и создаю db, затем загрузлю db со схемой sql.
Ниже приведены этапы:
1) Создать дамп схемы базы данных (
--schema-only
)pg_dump mydb -s > schema.sql
2) Удалить базу данных
drop database mydb;
3) Создать базу данных
create database mydb;
4) Схема импорта
psql mydb < schema.sql
источник
В этом случае, вероятно, было бы лучше иметь пустую базу данных, которую вы используете в качестве шаблона, а когда вам нужно обновить, удалите существующую базу данных и создайте новую из шаблона.
источник
Не могли бы вы использовать динамический SQL для выполнения каждого оператора по очереди? Возможно, вам придется написать скрипт PL / pgSQL для этого.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (раздел 38.5.4. Выполнение динамических команд)
источник
Вы также можете сделать это с помощью bash:
Вам нужно будет настроить имена схем, пароли и имена пользователей в соответствии с вашими схемами.
источник
Очистительная
AUTO_INCREMENT
версия:источник
Ребята, лучший и чистый способ:
1) Создать дамп схемы базы данных (только для --schema) pg_dump mydb -s> schema.sql
2) Удалить базу данных, удалить базу данных mydb;
3) Создать базу данных создать базу данных mydb;
4) Импортировать схему psql mydb <schema.sql
Это работа для меня!
Хорошего дня. Хирам Уокер
источник
Если вы можете использовать psql, вы можете использовать
\gexec
команду meta для выполнения вывода запроса;Обратите внимание, что
\gexec
введено в версии 9.6источник
Для удаления данных и сохранения табличных структур в pgAdmin вы можете сделать:
источник