Como selecionar um esquema no postgres ao usar o psql?


151

Eu tenho um banco de dados postgres com vários esquemas. Quando eu me conecto ao banco de dados a partir de um shell psqle o executo, \dtele usa o esquema de conexão padrão que é público . Existe um sinalizador que eu possa especificar ou como posso alterar o esquema?


Respostas:


196

No PostgreSQL, o sistema determina em qual tabela se deve seguir um caminho de pesquisa, que é uma lista de esquemas para procurar.

A primeira tabela correspondente no caminho de pesquisa é considerada a desejada, caso contrário, se não houver correspondência, um erro será gerado, mesmo que existam nomes de tabelas correspondentes em outros esquemas no banco de dados.

Para mostrar o caminho de pesquisa atual, você pode usar o seguinte comando:

SHOW search_path;

E para colocar o novo esquema no caminho, você pode usar:

SET search_path TO myschema;

Ou se você quiser vários esquemas:

SET search_path TO myschema, public;

Referência: https://www.postgresql.org/docs/current/static/ddl-schemas.html


77

Deseja alterar o banco de dados?

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

Atualizar.

Eu li novamente sua pergunta. Para exibir esquemas

\dn - list of schemas

Para alterar o esquema, você pode tentar

SET search_path TO

1
Como fazer isso não no psql. como "conectar"
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
Não seja como me esquecendo o período após o nome do esquema :) (obrigado, Mohamed!)
anapaulagomes

1
Isso não responde à pergunta. Ele perguntou como alterar o esquema padrão. Não são os comandos básicos do psql.
Kenny Steegmans 14/02

27

Use o nome do esquema com ponto no comando psql para obter informações sobre esse esquema.

Configuração:

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

Mostrar lista de relações em 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)

Mostrar test_schema.test_tabledefinição:

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

Mostrar todas as tabelas em 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 | 

etc ...


6
Estava faltando o período após \ dt test_schema. o que resulta em "nenhuma relação encontrado mensagem" Obrigado por exemplos, tornou muito mais fácil :)
mehany

14

Isso é antigo, mas eu coloquei exportações no meu alias para conectar ao db:

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

E para outro esquema:

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

2
Boa ideia. Eu omitiria exporte o ponto e vírgula em seus pseudônimos. Dessa forma PGOPTIONS, não fica por aí depois que você sai do psql.
precisa

essa é uma ótima idéia, muito mais prática do que adicionar uma SET search_patha cada consulta. obrigado!
Hraban

6

palavra chave:

SET search_path TO

exemplo:

SET search_path TO your_schema_name;

4

solução rápida pode ser:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

0

se estiver jogando com o psql dentro do docker exec, faça o seguinte:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.