Сгенерируйте DDL программно на Postgresql

Как я могу программно сгенерировать DDL таблицы в Postgresql? Есть ли системный запрос или команда для этого? Поиск в Google проблемы не дал никаких указателей.


person ruipacheco    schedule 10.12.2009    source источник


Ответы (6)


Используйте pg_dump с этими параметрами:

pg_dump -U user_name -h host database -s -t table_or_view_names -f table_or_view_names.sql

Описание:

-s or --schema-only : Dump only ddl / the object definitions (schema), without data.
-t or --table Dump :  Dump only tables (or views or sequences) matching table

Примеры:

-- dump each ddl table elon build.
$ pg_dump -U elon -h localhost -s -t spacex -t tesla -t solarcity -t boring > companies.sql

Извините, если не в тему. Просто хочу помочь тем, кто гуглил psql dump ddl и получил эту тему.

person Brain90    schedule 14.02.2012

Вы можете использовать команду pg_dump для создания дампа содержимого базы данных. (как схема, так и данные). Переключатель --schema-only будет выводить только DDL для ваших таблиц.

person Greg Hewgill    schedule 10.12.2009
comment
Я не совсем понимаю ваш комментарий. pg_dump устанавливается вместе с PostgreSQL и доступен на всех серверах. Для его использования не требуются специальные привилегии пользователя (обычные средства управления доступом PostgreSQL применяются к базе данных, которую вы выгружаете). Если вы не считаете это программным решением, вам придется указать, какую среду программирования вы используете, чтобы получить соответствующий ответ. - person Greg Hewgill; 11.12.2009

Почему использование psql не считается «программным»? Это очень красиво сбросит всю схему.

В любом случае, вы можете получить типы данных (и многое другое) из information_schema (здесь упоминаются документы 8.4, но это не новая функция):

=# select column_name, data_type from information_schema.columns
-# where table_name = 'config';
    column_name     | data_type 
--------------------+-----------
 id                 | integer
 default_printer_id | integer
 master_host_enable | boolean
(3 rows)
person Wayne Conrad    schedule 27.01.2010
comment
Как я сказал выше, у большинства моих пользователей не будет доступа к pg_dump или серверу PostgreSQL, поэтому я должен воспроизвести поведение pg_dump. - person ruipacheco; 29.01.2010
comment
Верно. Итак, ваш код запрашивает информационную схему (или обращается к psql), анализирует результаты и показывает результат вашим пользователям. - person Wayne Conrad; 29.01.2010

Ответ заключается в том, чтобы проверить исходный код pg_dump и следовать переключателям, которые он использует для создания DDL. Где-то внутри кода есть ряд запросов, используемых для извлечения метаданных, используемых для создания DDL.

person ruipacheco    schedule 27.01.2010

Вот хорошая статья о том, как получить метаинформацию из информационной схемы, http://www.alberton.info/postgresql_meta_info.html.

person iavci    schedule 09.08.2010
comment
Эта статья может быть полезной, но вы должны размещать соответствующие фрагменты здесь; ссылки часто мертвы. - person Brad Koch; 15.05.2014

Я сохранил 4 функции, чтобы частично смоделировать поведение pg_dump -s. На основе метакоманды \d+. Использование будет чем-то похожим:

\pset format unaligned
select get_ddl_t(schemaname,tablename) as "--" from pg_tables where tableowner <> 'postgres';

Конечно, вы должны создавать функции заранее.

Рабочий образец здесь, на rextester

person Vao Tsun    schedule 06.03.2017