Bonjour
Moi j'ai fait un truc en Python qui interroge les tables systèmes et qui me génère un fichier ".dot" permettant à un logiciel gratuit nommé graphviz de générer le schéma des tables et liens dans différents formats assez universel (par exemple pdf et jpg)
La requête qui liste les schémas et tables:
select table_schema, table_name from information_schema.tables where table_type='BASE TABLE' and table_schema not in ("information_schema", "pg_catalog") order by table_schema, table_name;
La requête qui récupère la clef primaire d'une table:
1 2 3 4 5 6 7
| select column_name
from information_schema.key_column_usage
where (constraint_schema, constraint_name)=(
select constraint_schema, constraint_name
from information_schema.table_constraints
where (table_schema, table_name, constraint_type)=('schema S', 'table T', 'PRIMARY KEY')
); |
La requête qui récupère tous les champs d'une table
1 2 3 4
| select column_name, data_type, character_maximum_length, numeric_precision, numeric_precision_radix, numeric_scale
from information_schema.columns
where (table_schema, table_name)=('schema S', 'table T')
order by ordinal_position; |
Et pour récupérer les contraintes d'intégrité associées à une table T là c'est le plus compliqué- récupérer les identifiants liants T et ses contraintes foreign key
1 2 3 4 5
| select pg_constraint.conrelid, pg_constraint.confrelid, pg_constraint.conkey, pg_constraint.confkey, t2.schemaname, t2.relname
from pg_constraint
inner join pg_stat_user_tables as t1 on (t1.relid=pg_constraint.conrelid)
inner join pg_stat_user_tables as t2 on (t2.relid=pg_constraint.confrelid)
where (pg_constraint.contype, t1.schemaname, t1.relname)=('f', 'schema S', 'table T'); |
=> ça te récupère autant de lignes qu'il y a de contraintes foreign associées à la table T. Chaque ligne contient - une colonne "conrelid" qui donne le oid de la table T (ex 77283)
- une colonne "confrelid" qui donne le oid de la table foreign laquelle elle est liée (ex 77252)
- 2 colonnes "conkey" (les clefs de la table) et "confkey (les clefs correspondantes de la table foreign). Ces clefs sont sous forme de tableau car elles peuvent être elles-mêmes composées de plusieurs colonnes et ces tableaux contiennent en fait les positions des colonnes dans la table. Donc ces colonnes "conkey" et "confkey" contiennent par exemple "{1, 3}" et "{4, 7}" ce qui signifie que les colonnes "1" et "3" de la table 77283 sont reliées aux colonnes "4" et "7" de la table distante 77252
- 2 colonnes "schemaname" et "relname" donnant les noms "sql" de la table foreign (donc ici le nom de la table 77252)
- A partir donc de ces infos "conrelid" + "conkey" d'une part et "confrelid" et "confkey" d'autre part, on récupère les noms réels des colonnes de la façon suivante:
1 2
| select attname from pg_attribute where attrelid=77283 and attnum in (1, 3);
select attname from pg_attribute where attrelid=77252 and attnum in (4, 7); |
Partager