Ik probeer PostgreSQL-administratie te leren en ben begonnen te leren hoe ik het psql
opdrachtregelprogramma moet gebruiken.
Wanneer ik me aanmeld met psql --username=postgres
, hoe geef ik dan een lijst van alle databases en tabellen?
Ik heb , d
en dS+
maar er wordt niets vermeld. Ik heb twee databases en een paar tabellen gemaakt met pgAdmin III, dus ik weet dat ze moeten worden vermeld.
Opmerkingen
Answer
Let op de volgende commandos:
-
\list
of\l
: lijst alle databases -
\dt
: maak een lijst van alle tabellen in de huidige database met uwsearch_path
-
\dt *.
: maak een lijst van alle tabellen in de huidige database, ongeacht uwsearch_path
U zult nooit tabellen in andere databases zien, deze tabellen zijn niet zichtbaar. U moet verbinding maken met de juiste database om de tabellen (en andere objecten) te zien.
Om tussen databases te wisselen:
\connect database_name
of \c database_name
Zie de handleiding over psql .
Reacties
- Je kunt
\c db_name
gebruiken om verbinding te maken met een bepaalde database. -
\dt
niet ‘ lijkt niet alle tabellen in de huidige database te tonen (het lijkt de tabellen uit te sluiten die niet ‘ t gevonden zijn in desearch_path
tenminste op 9.2) -
\dt *.
zal alle tabellen in alle schemas weergeven, zonder dat je je zoekpad hoeft te wijzigen. - \ l + is mijn favoriet – het toont ook het schijfgebruik.
- Op Windows kan ik de databases weergeven met dit commando
psql -U username -l
maar het werkt niet met de slash-versie.
Answer
Hier worden databases weergegeven:
SELECT datname FROM pg_database WHERE datistemplate = false;
Dit geeft een lijst van tabellen in de huidige database
SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;
Reacties
- Jij ‘ klopt, maar de vraag ging over de meta-commandos van de psql-tool. \ dt is veel gemakkelijker dan het typen van een vraag.
- Ik denk dat dit een GEWELDIG antwoord is, omdat het kan worden uitgevoerd vanaf een Linux-opdrachtregel in plaats van in de psql-interpreter te moeten staan die soms voor mij vastloopt met ExtraPutty.
- Heeft ook mijn dag gered. Voor mijn specifieke geval heb ik ‘ m
WHERE table_schema = 'public'
toegevoegd omdat ik alleen aangepaste tabellen wil verwijderen. - Als je begint psql met de -E vlag, zal het de echte vraag weergeven als je een meta-commando gebruikt.
- Ja, ik denk dat het ‘ een goed antwoord is stelt u in staat om op een meer gecontroleerde manier deel te nemen aan en querys uit te voeren op de databases, vooral wanneer u een script wilt genereren uit een grote databaselijst. Bedankt.
Antwoord
In Postgresql vermelden deze terminalopdrachten de beschikbare databases
el@defiant$ /bin/psql -h localhost --username=pgadmin --list
Of het commando is eenvoudiger gezegd:
psql -U pgadmin -l
Die commandos drukken dit af op de terminal:
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)
Dit zijn de beschikbare databases.
In PSQL geven deze commandos een lijst van de beschikbare tabellen
Je moet een database specificeren voordat je kan de tabellen in die database weergeven.
el@defiant$ psql -U pgadmin -d kurz_prod
Dit brengt je naar een psql-terminal:
kurz_prod=#
Gebruik het commando \d
wat betekent dat alle tabellen, views en sequenties worden getoond
kurz_prod=# \d
Dit print:
List of relations Schema | Name | Type | Owner --------+---------+----------+--------- public | mytable | table | pgadmin public | testing | sequence | pgadmin (2 rows)
Om de psql-terminal te verlaten, typ \q
en druk op enter. Of Ctrl-D
doet hetzelfde. Dit zijn de tabellen in die database.
Opmerkingen
- \ d geeft niet alleen tabellen weer:
\d[S+] list tables, views, and sequences
- Voor mij is dit het ” juiste ” antwoord omdat het niet ‘ Je hoeft niet al verbonden te zijn met een bestaande database.
- Eén liner voor gebruik in scripts (als root):
su - -c 'psql -U postgres postgres -P pager=off -P tuples_only=on -l' postgres | cut -d'|' -f1 | tr -d '[:blank:]' | grep -vE '$^'
Antwoord
\l
is ook een afkorting voor \list
. Er zijn nogal wat slash-commandos die je in psql kunt opsommen door \?
te gebruiken.
Answer
Om meer informatie te krijgen over database en tabellijst, kunt u het volgende doen:
\l+
om databases weer te geven
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)
en
\d+
om alle tabellen in het huidige zoekpadschema in de huidige database weer te geven.
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
Vanuit pg_Admin kunt u eenvoudig het volgende uitvoeren op uw huidige database en het zal alle tabellen voor het gespecificeerde schema ophalen:
SELECT * FROM information_schema.tables WHERE table_type = "BASE TABLE" AND table_schema = "public" ORDER BY table_type, table_name
Hiermee krijgt u een lijst met alle permanente tabellen (meestal de tabellen waarnaar u op zoek bent). U kunt alleen de tabelnamen krijgen als u het *
jokerteken wijzigt in alleen het table_name
. Het openbare table_schema
is het standaardschema voor de meeste databases, tenzij uw beheerder een nieuw schema heeft ingesteld.
Opmerkingen
- Hoewel dit waar is, richt dit zich tot een andere klant dan waar het OP naar vroeg.
- Dit werkte prima voor mij, en hoewel mijn use case niet precies was waar het OP om vroeg, hielp het me de tafellijst te krijgen terwijl ik verbonden was via wrapper (in Julialang LibPQ.jl )
Antwoord
Het is mogelijk dat u de tabellen in een schema dat niet in uw zoekpad staat, of de standaard, dat wil zeggen public, en dus zullen de tabellen niet verschijnen met \ dt. Als je een schema gebruikt dat bijvoorbeeld data heet, kun je dit oplossen door uit te voeren,
alter database <databasename> set search_path=data, public;
Sluit af en voer psql opnieuw in en nu \ dt laat je ook de tabellen in schemagegevens zien.
Opmerkingen
- Nou, een simpele
set search_path=data, public;
zou ook lukken 🙂 - @dezso, maakt dat de verandering permanent, of alleen in die psql-sessie?
- Err, ik was niet erg duidelijk. Het was bedoeld in plaats van de logout-login-cyclus.
psql -l
psql --username=postgres -l
.