Bagaimana cara memilih skema di postgres saat menggunakan psql?


151

Saya memiliki database postgres dengan banyak skema. Ketika saya terhubung ke database dari shell dengan psqldan saya menjalankannya \dtmenggunakan skema koneksi default yang bersifat publik . Apakah ada flag yang bisa saya tentukan atau bagaimana saya bisa mengubah skema?


Jawaban:


197

Dalam PostgreSQL sistem menentukan tabel mana yang dimaksud dengan mengikuti jalur pencarian, yang merupakan daftar skema yang harus dicari.

Tabel pencocokan pertama di jalur pencarian dianggap sebagai yang diinginkan, jika tidak, jika tidak ada kecocokan, kesalahan akan muncul, bahkan jika nama tabel yang cocok ada di skema lain dalam database.

Untuk menunjukkan jalur pencarian saat ini Anda dapat menggunakan perintah berikut:

SHOW search_path;

Dan untuk meletakkan skema baru di jalur, Anda dapat menggunakan:

SET search_path TO myschema;

Atau jika Anda ingin beberapa skema:

SET search_path TO myschema, public;

Referensi: https://www.postgresql.org/docs/current/static/ddl-schemas.html


77

Apakah Anda ingin mengubah basis data?

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

Memperbarui.

Saya sudah membaca lagi pertanyaan Anda. Untuk menampilkan skema

\dn - list of schemas

Untuk mengubah skema, Anda dapat mencoba

SET search_path TO

1
Bagaimana melakukan ini tidak dalam psql. cara "terhubung"
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'.

17
Jangan seperti saya lupa tentang periode setelah nama skema :) (terima kasih, Mohamed!)
anapaulagomes

1
Ini tidak menjawab pertanyaan. Dia bertanya bagaimana mengubah skema default. Bukan perintah dasar untuk psql.
Kenny Steegmans

27

Gunakan nama skema dengan titik dalam perintah psql untuk mendapatkan informasi tentang skema ini.

Mempersiapkan:

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

Tampilkan daftar relasi di 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)

Perlihatkan test_schema.test_tabledefinisi:

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

Tampilkan semua tabel di 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 | 

dll ...


6
Saya melewatkan periode setelah test_schema. yang menghasilkan "tidak ada hubungan pesan yang ditemukan" Terima kasih atas contohnya, membuatnya lebih mudah :)
mehany

14

Ini sudah tua, tapi saya memasukkan ekspor ke alias saya untuk menghubungkan ke db:

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

Dan untuk skema lain:

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

2
Ide bagus. Saya akan menghilangkan exportdan titik koma di alias Anda. Cara PGOPTIONSini tidak tinggal setelah Anda meninggalkan psql.
Doron Gold

ini adalah ide yang bagus, jauh lebih praktis daripada menambahkan SET search_pathsetiap permintaan. Terima kasih!
hraban

6

kata kunci:

SET search_path TO

contoh:

SET search_path TO your_schema_name;

4

solusi cepat dapat:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

0

jika bermain dengan psql di dalam docker exec seperti ini:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.