web-dev-qa-db-fra.com

Générer DDL par programme sur Postgresql

Comment puis-je générer le DDL d'une table par programme sur Postgresql? Existe-t-il une requête ou une commande système pour le faire? Googler le problème n'a renvoyé aucun pointeur.

29
ruipacheco

La réponse est de vérifier le code source de pg_dump et de suivre les commutateurs qu'il utilise pour générer le DDL. Quelque part dans le code, il existe un certain nombre de requêtes utilisées pour récupérer les métadonnées utilisées pour générer la DDL.

3
ruipacheco

Utilisation pg_dump avec ces options:

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

La description:

-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

Exemples:

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

Désolé si hors sujet. Je veux juste aider qui googler "psql dump ddl" et redirigé vers ce fil.

33
Brain90

Vous pouvez utiliser le pg_dump commande pour vider le contenu de la base de données (schéma et données). Le --schema-only switch ne videra que le DDL pour vos tables.

19
Greg Hewgill

Pourquoi le décorticage sur psql ne compterait-il pas comme "par programme"? Cela videra très bien l'ensemble du schéma.

Quoi qu'il en soit, vous pouvez obtenir des types de données (et bien plus) à partir du information_schema (8.4 documents référencés ici, mais ce n'est pas une nouvelle fonctionnalité):

=# 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)
3
Wayne Conrad

I enregistré 4 fonctions pour maquiller pg_dump -s comportement partiellement. Basé sur \d+ métacommande. L'utilisation serait similaire:

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

Bien sûr, vous devez créer des fonctions au préalable.

Exemple de travail ici au rextester

2
Vao Tsun

Voici un bon article sur la façon d'obtenir les méta-informations de information_schema, http://www.alberton.info/postgresql_meta_info.html .

2
iavci