J'aimerais répertorier toutes les tables de la base de données liferay
de mon installation PostgreSQL. Comment je fais ça?
Je voudrais exécuter SELECT * FROM applications;
dans la base de données liferay
. applications
est une table dans ma vie, db. Comment est-ce fait?
Voici une liste de toutes mes bases de données:
postgres=# \list
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
liferay | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | liferay=CTc/postgres
lportal | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 |
postgres | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 |
template0 | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=#
Si vous souhaitez lister toutes les tables , vous devez utiliser:
\dt *.*
pour indiquer que vous voulez toutes les tables dans tous les schémas . Cela inclura les tables dans pg_catalog
, les tables système et celles dans information_schema
. Il n'y a pas de moyen intégré de dire "toutes les tables dans tous les schémas définis par l'utilisateur"; vous pouvez toutefois définir votre search_path
sur une liste de tous les schémas d’intérêt avant de lancer \dt
.
Vous voudrez peut-être le faire par programme, auquel cas psql
les commandes antislash ne suffiront pas. C'est ici que le INFORMATION_SCHEMA
vient à la rescousse. Pour lister les tables:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
En passant, si vous voulez voir ce que psql
fait en réponse à une commande de barre oblique inversée, exécutez psql
avec l'indicateur -E
. par exemple:
$ psql -E regress
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
d.datcollate as "Collate",
d.datctype as "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************
vous pouvez donc voir que psql
cherche pg_catalog.pg_database
quand il obtient une liste de bases de données. De même, pour les tables d'une base de données donnée:
SELECT n.nspname as "Schema",
c.relname as "Name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;
Il est préférable d'utiliser le INFORMATION_SCHEMA
portable _ standard au lieu de SQL, si possible, mais vous avez parfois besoin d'informations spécifiques à Pg. Dans ces cas, il est judicieux d'interroger le catalogues système directement, et psql -E
peut être un guide utile pour savoir comment procéder.
Connectez-vous à la base de données, puis listez les tables:
\c liferay
\dt
C'est comme ça que je le fais quand même.
Vous pouvez combiner ces deux commandes sur une seule ligne, si vous préférez:
\c liferay \dt
Pour voir les tables publiques que vous pouvez faire
tables de liste
\dt
les privilèges d'accès aux tables, aux vues et aux listes
\dp or \z
ou juste les noms de table
select table_name from information_schema.tables where table_schema = 'public';
Dans SQL Query, vous pouvez écrire ce code:
select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';
Remplacez votre schéma de table par YOUR_TABLE_SCHEME;
Exemple:
select table_name from information_schema.tables where table_schema='eLearningProject';
Pour voir tous les schémas et toutes les tables, il n'est pas nécessaire d'utiliser la clause where:
select table_name from information_schema.tables
Cela peut être utilisé dans les scripts d'automatisation si vous n'avez pas besoin de toutes les tables dans tous les schémas:
for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
...
done