Próbuję nauczyć się administrowania PostgreSQL i zacząłem uczyć się, jak używać narzędzia wiersza poleceń psql
.
Kiedy loguję się za pomocą psql --username=postgres
, jak wyświetlić listę wszystkich baz danych i tabel?
Próbowałem \d
, d
i dS+
, ale nic nie jest wymienione. Utworzyłem dwie bazy danych i kilka tabel za pomocą pgAdmin III, więc wiem, że powinny być wymienione.
Komentarze
Odpowiedź
Zwróć uwagę na następujące polecenia:
-
\list
lub\l
: wyświetl wszystkie bazy danych -
\dt
: wyświetl wszystkie tabele w bieżącej bazie danych, używającsearch_path
-
\dt *.
: wyświetla wszystkie tabele w bieżącej bazie danych, niezależnie odsearch_path
Nigdy nie zobaczysz tabel w innych bazach danych, te tabele nie są widoczne. Aby zobaczyć jej tabele (i inne obiekty), musisz połączyć się z odpowiednią bazą danych.
Aby przełączyć bazy danych:
\connect database_name
lub \c database_name
Zobacz podręcznik dotyczący psql .
Komentarze
- Możesz użyć
\c db_name
, aby połączyć się z określoną bazą danych. -
\dt
nie ' nie pojawia się na liście wszystkich tabel w bieżącej bazie danych (wydaje się wykluczać te, których nie ' nie znaleziono wsearch_path
przynajmniej w wersji 9.2) -
\dt *.
wyświetli listę wszystkich tabel we wszystkich schematach, bez konieczności modyfikowania ścieżki wyszukiwania. - \ l + jest mój ulubiony – pokazuje również użycie dysku.
- W systemie Windows mogę wyświetlić listę baz danych za pomocą tego polecenia
psql -U username -l
, ale nie działa to z wersją z ukośnikiem.
Odpowiedź
Zawiera listę baz danych:
SELECT datname FROM pg_database WHERE datistemplate = false;
Ta lista zawiera tabele w bieżącej bazie danych
SELECT table_schema,table_name FROM information_schema.tables ORDER BY table_schema,table_name;
Komentarze
- Ty ' zgadza się, ale pytanie dotyczyło meta-poleceń narzędzia psql. \ dt jest o wiele łatwiejsze niż wpisywanie jakiegokolwiek zapytania.
- Myślę, że jest to WSPANIAŁA odpowiedź, ponieważ można ją wykonać z wiersza poleceń Linuksa, w przeciwieństwie do konieczności korzystania z interpretera psql, który czasami zawiesza się przy użyciu ExtraPutty.
- Uratowałem też mój dzień. W moim przypadku ' m dodając
WHERE table_schema = 'public'
, ponieważ chcę porzucić tylko niestandardowe tabele. - Jeśli zaczniesz psql z flagą -E, wyświetli prawdziwe zapytanie, gdy użyjesz meta-polecenia.
- Tak, myślę, że ' to dobra odpowiedź, ponieważ umożliwia łączenie się i wysyłanie zapytań do baz danych w bardziej kontrolowany sposób, szczególnie gdy chcesz wygenerować skrypt z dużej listy baz danych. Dzięki.
Odpowiedz
W Postgresql te polecenia terminala zawierają listę dostępnych baz danych
el@defiant$ /bin/psql -h localhost --username=pgadmin --list
Lub polecenie podane prościej:
psql -U pgadmin -l
Te polecenia wyświetlają to na terminalu:
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)
To są dostępne bazy danych.
W PSQL te polecenia wyświetlają dostępne tabele
Musisz określić bazę danych przed może wyświetlić tabele w tej bazie danych.
el@defiant$ psql -U pgadmin -d kurz_prod
To przeniesie Cię do terminala psql:
kurz_prod=#
Użyj polecenia \d
, co oznacza wyświetlenie wszystkich tabel, widoków i sekwencji
kurz_prod=# \d
To drukuje:
List of relations Schema | Name | Type | Owner --------+---------+----------+--------- public | mytable | table | pgadmin public | testing | sequence | pgadmin (2 rows)
Następnie, aby wyjść z terminala psql, wpisz \q
i naciśnij Enter. Lub Ctrl-D
robi to samo. To są tabele w tej bazie danych.
Komentarze
- \ d zawiera nie tylko listę tabel:
\d[S+] list tables, views, and sequences
- Dla mnie to jest ” poprawna ” odpowiedź, ponieważ nie ' t wymaga, abyś był już połączony z istniejącą bazą danych.
- Jedna linijka do użytku w skryptach (jako root):
su - -c 'psql -U postgres postgres -P pager=off -P tuples_only=on -l' postgres | cut -d'|' -f1 | tr -d '[:blank:]' | grep -vE '$^'
Odpowiedź
\l
to także skrót \list
. Jest sporo poleceń z ukośnikiem, które możesz wyświetlić w psql, używając \?
.
Odpowiedź
Aby uzyskać więcej informacji o bazie danych i liście tabel, możesz:
\l+
, aby wyświetlić listę baz danych
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)
i
\d+
, aby wyświetlić wszystkie tabele w bieżącym schemacie ścieżka_wyszukiwania w bieżącej bazie danych.
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)
Odpowiedź
Z pg_Admin możesz po prostu uruchomić następujące polecenie w swojej aktualnej bazie danych, a otrzymasz wszystkie tabele dla określonego schematu:
SELECT * FROM information_schema.tables WHERE table_type = "BASE TABLE" AND table_schema = "public" ORDER BY table_type, table_name
To da ci listę wszystkich stałych tabel (zazwyczaj tabel, których szukasz). Możesz uzyskać tylko nazwy tabel, jeśli zmienisz symbol wieloznaczny *
na tylko table_name
. Publiczny table_schema
to domyślny schemat większości baz danych, chyba że administrator skonfigurował nowy schemat.
Komentarze
- To prawda, ale dotyczy to innego klienta niż pytał OP.
- To zadziałało świetnie i chociaż mój przypadek użycia nie był dokładnie tym, o co prosił OP, pomógł mi uzyskać listę tabel podczas połączenia przez wrapper (w Julialang LibPQ.jl )
Odpowiedź
Możliwe, że wstawiłeś tabele do schemat, którego nie ma w Twojej ścieżce wyszukiwania lub domyślny, tj. publiczny, dlatego tabele nie będą wyświetlane przy użyciu \ dt. Jeśli używasz schematu o nazwie, powiedzmy, data, możesz to naprawić, uruchamiając,
alter database <databasename> set search_path=data, public;
Wyjdź i ponownie wprowadź psql i teraz \ dt pokaże również tabele w danych schematu.
Komentarze
- Cóż, prosty
set search_path=data, public;
też by załatwił sprawę 🙂 - @dezso, czy to powoduje zmianę na stałe, czy tylko w tej sesji psql?
- Eee, nie byłem zbyt jasny. Miało to miejsce zamiast cyklu wylogowania-logowania.
psql -l
psql --username=postgres -l
.