Sto cercando di imparare lamministrazione di PostgreSQL e ho iniziato a imparare come utilizzare lo strumento da riga di comando psql
.
Quando accedo con psql --username=postgres
, come faccio a elencare tutti i database e le tabelle?
Ho provato \d
, d
e dS+
ma non viene elencato nulla. Ho creato due database e alcune tabelle con pgAdmin III, quindi so che dovrebbero essere elencati.
Commenti
Rispondi
Tieni presente i seguenti comandi:
-
\list
o\l
: elenca tutti i database -
\dt
: elenca tutte le tabelle nel database corrente utilizzando il tuosearch_path
-
\dt *.
: elenca tutte le tabelle nel database corrente indipendentemente dal tuosearch_path
Non vedrai mai tabelle in altri database, queste tabelle non sono visibili. Devi connetterti al database corretto per vedere le sue tabelle (e altri oggetti).
Per cambiare database:
\connect database_name
o \c database_name
Consulta il manuale su psql .
Commenti
- Puoi utilizzare
\c db_name
per connetterti a un determinato database. -
\dt
non ‘ non sembra elencare tutte le tabelle nel database corrente (sembra escludere quelle che non sono ‘ trovate nelsearch_path
almeno su 9.2) -
\dt *.
elencherà tutte le tabelle in tutti gli schemi, senza dover modificare il percorso di ricerca. - \ l + è il mio preferito: mostra anche lutilizzo del disco.
- Su Windows posso elencare i database con questo comando
psql -U username -l
ma non funziona con la versione slash.
Risposta
Questo elenca i database:
SELECT datname FROM pg_database WHERE datistemplate = false;
Questo elenca le tabelle nel database corrente
SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;
Commenti
- Tu ‘ ha ragione, ma la domanda riguardava i meta-comandi dello strumento psql. \ dt è molto più semplice che digitare qualsiasi query.
- Penso che questa sia unottima risposta perché può essere eseguita da una riga di comando di Linux invece di dover essere nellinterprete psql che a volte si blocca per me che uso ExtraPutty.
- Mi ha anche salvato la giornata. Nel mio caso particolare, ‘ sto aggiungendo
WHERE table_schema = 'public'
perché desidero eliminare solo tabelle personalizzate. - Se inizi psql con il flag -E, mostrerà la vera query quando usi un meta-comando.
- Sì, penso che ‘ sia una buona risposta in quanto ti consente di unirti e interrogare i database in un modo più controllato, specialmente quando vuoi generare uno script da un grande elenco di database. Grazie.
Risposta
In Postgresql questi comandi del terminale elencano i database disponibili
el@defiant$ /bin/psql -h localhost --username=pgadmin --list
Oppure il comando dichiarato più semplicemente:
psql -U pgadmin -l
Questi comandi lo stampano sul terminale:
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- kurz_prod | pgadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | pgadmin | pgadmin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (5 rows)
Questi sono i database disponibili.
In PSQL questi comandi elencano le tabelle disponibili
Devi specificare un database prima di può elencare le tabelle in quel database.
el@defiant$ psql -U pgadmin -d kurz_prod
Questo ti porta a un terminale psql:
kurz_prod=#
Usa il comando \d
che significa mostrare tutte le tabelle, le viste e le sequenze
kurz_prod=# \d
Questo stampa:
List of relations Schema | Name | Type | Owner --------+---------+----------+--------- public | mytable | table | pgadmin public | testing | sequence | pgadmin (2 rows)
Quindi, per uscire dal terminale psql, digita \q
e premi Invio. Oppure Ctrl-D
fa la stessa cosa. Queste sono le tabelle in quel database.
Commenti
- \ d non elenca solo le tabelle:
\d[S+] list tables, views, and sequences
- Per me, questa è la ” corretta ” risposta perché ‘ t richiede che tu sia già connesso a un database esistente.
- Un liner da usare negli script (come root):
su - -c 'psql -U postgres postgres -P pager=off -P tuples_only=on -l' postgres | cut -d'|' -f1 | tr -d '[:blank:]' | grep -vE '$^'
Risposta
\l
è anche una scorciatoia per \list
. Ci sono alcuni comandi slash, che puoi elencare in psql utilizzando \?
.
Risposta
Per ottenere maggiori informazioni sul database e lelenco delle tabelle, puoi fare:
\l+
per elencare i database
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description ------------+----------+----------+-------------+-------------+-----------------------+---------+------------+-------------------------------------------- pgbench | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 29 MB | pg_default | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 6073 kB | pg_default | default administrative connection database slonmaster | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 1401 MB | movespace | slonslave | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 32 MB | pg_default | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 5785 kB | pg_default | unmodifiable empty database | | | | | postgres=CTc/postgres | | | template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +| 5985 kB | pg_default | default template for new databases | | | | | postgres=CTc/postgres | | | test | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | | 13 MB | pg_default | (7 rows)
e
\d+
per elencare tutte le tabelle nello schema search_path corrente nel database corrente.
test=# \dn+ --list schemas List of schemas Name | Owner | Access privileges | Description --------+----------+----------------------+------------------------ public | postgres | postgres=UC/postgres+| standard public schema | | =UC/postgres | schema1 | postgres | postgres=UC/postgres+| | | =UC/postgres | (2 row) test=# set search_path to schema1, public; SET test=# \d+ List of relations Schema | Name | Type | Owner | Size | Description ---------+-----------------+-------+--------------+------------+------------- public | all_units | table | postgres | 0 bytes | public | asset | table | postgres | 16 kB | public | asset_attribute | table | postgres | 8192 bytes | public | food | table | postgres | 48 kB | public | name_log | table | postgres | 8192 bytes | public | outable | table | ordinaryuser | 0 bytes | public | outable2 | table | ordinaryuser | 0 bytes | public | test | table | postgres | 16 kB | public | usr | table | postgres | 5008 kB | schema1 | t1 | table | postgres | 0 bytes | (10 rows)
Answer
Da pg_Admin puoi semplicemente eseguire quanto segue sul tuo database corrente e otterrà tutte le tabelle per lo schema specificato:
SELECT * FROM information_schema.tables WHERE table_type = "BASE TABLE" AND table_schema = "public" ORDER BY table_type, table_name
Questo ti farà un elenco di tutte le tabelle permanenti (generalmente le tabelle che “stai cercando). Puoi ottenere solo i nomi delle tabelle se cambi il carattere jolly *
con il solo table_name
. Il table_schema
pubblico è lo schema predefinito per la maggior parte dei database, a meno che lamministratore non abbia impostato un nuovo schema.
Commenti
- Anche se questo è vero, si rivolge a un cliente diverso rispetto a quello richiesto dallOP.
- Questo ha funzionato alla grande per me e, sebbene il mio caso duso non fosse esattamente quello che chiedeva lOP, mi ha aiutato a ottenere lelenco delle tabelle mentre ero connesso tramite wrapper (in Julialang LibPQ.jl )
Risposta
È possibile che tu abbia inserito le tabelle in un schema che non è nel tuo percorso di ricerca, o quello predefinito, cioè pubblico, quindi le tabelle non verranno visualizzate usando \ dt. Se utilizzi uno schema chiamato, ad esempio, dati, puoi risolvere il problema eseguendo,
alter database <databasename> set search_path=data, public;
Esci e rientra in psql e ora \ dt ti mostrerà anche le tabelle nei dati dello schema.
Commenti
- Bene, un semplice
set search_path=data, public;
farebbe anche il trucco 🙂 - @dezso, questo apporta la modifica in modo permanente o solo in quella sessione psql?
- Ehm, non sono stato molto chiaro. Era inteso al posto del ciclo logout-login.
psql -l
psql --username=postgres -l
.