Jeg prøver at lære PostgreSQL-administration og er begyndt at lære at bruge kommandolinjeværktøjet psql
.
Når jeg logger ind med psql --username=postgres
, hvordan viser jeg alle databaser og tabeller?
Jeg har prøvet \d
, d
og dS+
men intet er angivet. Jeg har oprettet to databaser og et par tabeller med pgAdmin III, så jeg ved, at de skal vises.
Kommentarer
Svar
Vær opmærksom på følgende kommandoer:
-
\list
eller\l
: liste alle databaser -
\dt
: liste alle tabeller i den aktuelle database ved hjælp af dinsearch_path
-
\dt *.
: liste alle tabeller i den aktuelle database uanset dinsearch_path
Du vil aldrig se tabeller i andre databaser, disse tabeller er ikke synlig. Du skal oprette forbindelse til den korrekte database for at se dens tabeller (og andre objekter).
For at skifte database:
\connect database_name
eller \c database_name
Se vejledningen om psql .
Kommentarer
- Du kan bruge
\c db_name
til at oprette forbindelse til en bestemt database. -
\dt
ikke ‘ ser ikke ud til at liste alle tabeller i den aktuelle database (det ser ud til at udelukke dem, der ikke findes ‘ t isearch_path
mindst 9.2) -
\dt *.
viser alle tabeller i alle skemaer uden at skulle ændre din søgesti. - \ l + er min favorit – det viser også diskforbruget.
- På Windows kan jeg liste databaserne med denne kommando
psql -U username -l
men det fungerer ikke med skråstregversionen.
Svar
Dette viser databaser:
SELECT datname FROM pg_database WHERE datistemplate = false;
Dette viser tabeller i den aktuelle database
SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;
Kommentarer
- Du ‘ har ret, men spørgsmålet var om metakommandoer til psql-værktøjet. \ dt er meget nemmere end at skrive nogen forespørgsel.
- Jeg synes dette er et STOR svar, fordi det kan udføres fra en Linux-kommandolinje i modsætning til at skulle være i psql-tolken, som nogle gange hænger for mig ved hjælp ExtraPutty.
- Reddet også min dag. I mit særlige tilfælde ‘ m tilføjer
WHERE table_schema = 'public'
fordi jeg bare vil droppe tilpassede tabeller. - Hvis du starter psql med -E-flag, det viser den rigtige forespørgsel, når du bruger en metakommando.
- Ja, jeg synes, det ‘ er et godt svar, da det giver dig mulighed for at deltage i og forespørge databaser på en mere kontrolleret måde, især når du vil generere noget script ud af en stor databaseliste. Tak.
Svar
I Postgresql viser disse terminalkommandoer de tilgængelige databaser
el@defiant$ /bin/psql -h localhost --username=pgadmin --list
Eller kommandoen sagde mere enkelt:
psql -U pgadmin -l
Disse kommandoer udskriver dette på terminalen:
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)
Dette er de tilgængelige databaser.
I PSQL viser disse kommandoer de tilgængelige tabeller
Du skal angive en database, før du kan angive tabellerne i databasen.
el@defiant$ psql -U pgadmin -d kurz_prod
Dette bringer dig til en psql-terminal:
kurz_prod=#
Brug kommandoen \d
hvilket betyder at vise alle tabeller, visninger og sekvenser
kurz_prod=# \d
Dette udskriver:
List of relations Schema | Name | Type | Owner --------+---------+----------+--------- public | mytable | table | pgadmin public | testing | sequence | pgadmin (2 rows)
For at afslutte psql-terminalen skal du skrive \q
og trykke på enter. Eller Ctrl-D
gør det samme. Dette er tabellerne i den database.
Kommentarer
- \ d viser ikke bare tabeller:
\d[S+] list tables, views, and sequences
- For mig er dette ” korrekt ” svaret, fordi det ikke ‘ kræver ikke, at du allerede er tilsluttet en eksisterende database.
- En linie til brug i scripts (som root):
su - -c 'psql -U postgres postgres -P pager=off -P tuples_only=on -l' postgres | cut -d'|' -f1 | tr -d '[:blank:]' | grep -vE '$^'
Svar
\l
er også stenografi for \list
. Der er en hel del skråstregkommandoer, som du kan angive i psql ved hjælp af \?
.
Svar
For at få mere information om database og tabelliste kan du gøre:
\l+
for at liste databaser
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)
og
\d+
for at angive alle tabeller i det aktuelle søgeskibsskema i den aktuelle database.
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)
Svar
Fra pg_Admin kan du blot køre følgende på din nuværende database, og det får alle tabellerne til det angivne skema:
SELECT * FROM information_schema.tables WHERE table_type = "BASE TABLE" AND table_schema = "public" ORDER BY table_type, table_name
Dette får dig en liste over alle de permanente tabeller (generelt de tabeller, du leder efter). Du kan få bare tabelnavnene, hvis du ændrer *
jokertegnet til bare table_name
. Det offentlige table_schema
er standardskemaet for de fleste databaser, medmindre din administrator har oprettet et nyt skema.
Kommentarer
- Selvom dette er sandt, henvender det sig til en anden klient end OPen spurgte om.
- Dette fungerede godt for mig, og selvom min brugssag ikke var nøjagtigt det, som OP bad om, hjalp det mig med at få listen over tabeller, mens jeg var tilsluttet via indpakning (i Julialang LibPQ.jl )
Svar
Det er muligt, at du har indsat tabellerne i en skema, der ikke er i din søgesti, eller standard, dvs. offentlig, og så vises ikke tabellerne ved hjælp af \ dt. Hvis du bruger et skema kaldet, siger data, kan du rette dette ved at køre
alter database <databasename> set search_path=data, public;
Afslut og genindfør psql og nu \ dt viser dig også tabellerne i skemadata.
Kommentarer
- Nå, en simpel
set search_path=data, public;
ville også gøre tricket 🙂 - @dezso, gør det ændringen permanent eller bare i den psql-session?
- Fejl, jeg var ikke særlig klar. Det var beregnet i stedet for logout-login-cyklussen.
psql -l
psql --username=postgres -l
.