psqlを使用するときにpostgresでスキーマを選択する方法は?


151

複数のスキーマを持つpostgresデータベースがあります。でシェルからデータベースに接続してpsql実行する\dtと、デフォルトの接続スキーマであるpublicが使用されます。指定できるフラグはありますか、またはスキーマをどのように変更できますか?


回答:


196

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の後のピリオドがありませんでした。その結果、「関係が見つかりません」というメッセージが表示されます。例をお
寄せ

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を終了した後は残りません。
Doron Gold、

これは素晴らしいアイデアであり、SET search_pathすべてのクエリにを追加するよりもはるかに実用的です。ありがとうございました!
hraban



0

docker exec内でpsqlを使用する場合は、次のようにします。

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.