Як вибрати схему в postgres при використанні psql?


151

У мене база даних postgres з кількома схемами. Коли я підключаюсь до бази даних з оболонки psqlі запускаю \dtїї, використовується схема підключення за замовчуванням, яка є загальнодоступною . Чи є прапор, який я можу вказати, або як я можу змінити схему?


Відповіді:


197

У PostgreSQL система визначає, яку таблицю мається на увазі, слідуючи шляху пошуку, який є списком схем для пошуку.

Перша таблиця узгодження в шляху пошуку приймається такою, яку потрібно шукати, інакше, якщо немає відповідності, виникає помилка, навіть якщо відповідні імена таблиць існують в інших схемах бази даних.

Щоб показати поточний шлях пошуку, ви можете скористатися такою командою:

SHOW search_path;

І щоб поставити нову схему в шлях, ви можете використовувати:

SET search_path TO myschema;

Або якщо вам потрібно кілька схем:

SET search_path TO myschema, public;

Довідка: https://www.postgresql.org/docs/current/static/ddl-schemas.html


77

Ви хочете змінити базу даних?

\l - to display databases
\c - connect to new database

Оновлення.

Я знову прочитав ваше запитання. Для відображення схем

\dn - list of schemas

Щоб змінити схему, можна спробувати

SET search_path TO

1
Як це зробити не в psql. як "підключитися"
mathtick

46
\l - Display database
\c - Connect to database
\dn - List schemas
\dt - List tables inside public schemas
\dt schema1. - List tables inside particular schemas. For eg: 'schema1'.

16
Не будьте так, як я забуваю про період після назви схеми :) (дякую, Мохамед!)
anapaulagomes

1
Це не дає відповіді на запитання. Він запитав, як змінити схему за замовчуванням. Не основні команди для psql.
Кенні Стігманс

27

Використовуйте ім'я схеми з періодом у команді psql для отримання інформації про цю схему.

Налаштування:

test=# create schema test_schema;
CREATE SCHEMA
test=# create table test_schema.test_table (id int);
CREATE TABLE
test=# create table test_schema.test_table_2 (id int);
CREATE TABLE

Показати перелік відносин у test_schema:

test=# \dt test_schema.
               List of relations
   Schema    |     Name     | Type  |  Owner   
-------------+--------------+-------+----------
 test_schema | test_table   | table | postgres
 test_schema | test_table_2 | table | postgres
(2 rows)

Показати test_schema.test_tableвизначення:

test=# \d test_schema.test_table
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

Показати всі таблиці у test_schema:

test=# \d test_schema.
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

Table "test_schema.test_table_2"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

тощо ...


6
Я пропустив період після \ dt test_schema. що призводить до "жодного зв’язку не знайдено". Дякуємо за приклади, зробили це набагато простіше :)
mehany

14

Це старе, але я поставив експорт у своєму псевдонімі для підключення до db:

alias schema_one.con="PGOPTIONS='--search_path=schema_one' psql -h host -U user -d database etc"

І для іншої схеми:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"

2
Хороша ідея. Я б опустив exportі крапку з комою у ваших псевдонімах. Цей спосіб PGOPTIONSне залишається навколо, коли ви покинете psql.
Дорон Золото

це чудова ідея, набагато практичніша, ніж додавання SET search_pathкожного запиту. спасибі!
hraban



0

якщо граєте з psql всередині docker, виконайте це так:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.