Come si elencano tutti i database e le tabelle utilizzando psql?

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

  • Se vuoi accedervi tramite la riga di comando, esegui psql -l
  • Questo commento dovrebbe essere sicuramente una delle risposte migliori! Se hai bisogno dellautenticazione, puoi anche psql --username=postgres -l.

Rispondi

Tieni presente i seguenti comandi:

  • \list o \l: elenca tutti i database
  • \dt: elenca tutte le tabelle nel database corrente utilizzando il tuo search_path
  • \dt *.: elenca tutte le tabelle nel database corrente indipendentemente dal tuo search_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 nel search_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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *