Làm thế nào để chọn một lược đồ trong postgres khi sử dụng psql?


151

Tôi có một cơ sở dữ liệu postgres với nhiều lược đồ. Khi tôi kết nối với cơ sở dữ liệu từ shell psqlvà tôi chạy \dtnó sử dụng lược đồ kết nối mặc định là công khai . Có một cờ tôi có thể chỉ định hoặc làm thế nào tôi có thể thay đổi lược đồ?


Câu trả lời:


196

Trong PostgreQuery, hệ thống xác định bảng nào có nghĩa là theo đường dẫn tìm kiếm, đó là danh sách các lược đồ cần tìm.

Bảng khớp đầu tiên trong đường dẫn tìm kiếm được lấy là bảng mong muốn, nếu không, nếu không có lỗi trùng khớp, ngay cả khi tên bảng phù hợp tồn tại trong các lược đồ khác trong cơ sở dữ liệu.

Để hiển thị đường dẫn tìm kiếm hiện tại, bạn có thể sử dụng lệnh sau:

SHOW search_path;

Và để đặt lược đồ mới trong đường dẫn, bạn có thể sử dụng:

SET search_path TO myschema;

Hoặc nếu bạn muốn nhiều lược đồ:

SET search_path TO myschema, public;

Tham khảo: https://www.postgresql.org/docs/cản/static/ddl-schemas.html


77

Bạn có muốn thay đổi cơ sở dữ liệu?

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

Cập nhật.

Tôi đã đọc lại câu hỏi của bạn. Để hiển thị các lược đồ

\dn - list of schemas

Để thay đổi lược đồ, bạn có thể thử

SET search_path TO

1
Làm thế nào để làm điều này không trong psql. cách "kết nối"
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
Đừng như tôi quên về khoảng thời gian sau tên lược đồ :) (cảm ơn bạn, Mohamed!)
anapaulagomes

1
Điều này không trả lời câu hỏi. Ông hỏi làm thế nào để thay đổi lược đồ mặc định. Không phải là các lệnh cơ bản cho psql.
Kenny Steegmans

27

Sử dụng tên lược đồ với dấu chấm trong lệnh psql để lấy thông tin về lược đồ này.

Thiết lập:

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

Hiển thị danh sách các mối quan hệ trong 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)

Hiển thị test_schema.test_tableđịnh nghĩa:

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

Hiển thị tất cả các bảng trong 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 | 

Vân vân...


6
Tôi đã bỏ lỡ khoảng thời gian sau \ dt test_schema. dẫn đến "không có thông báo tìm thấy thông báo" Cảm ơn các ví dụ, đã làm cho nó dễ dàng hơn nhiều :)
mehany

14

Điều này đã cũ, nhưng tôi đặt xuất khẩu trong bí danh của mình để kết nối với db:

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

Và cho một lược đồ khác:

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

2
Ý kiến ​​hay. Tôi sẽ bỏ qua exportvà dấu chấm phẩy trong bí danh của bạn. Cách PGOPTIONSnày không tồn tại xung quanh sau khi bạn rời khỏi psql.
Vàng Doron

đây là một ý tưởng tuyệt vời, thiết thực hơn nhiều so với việc thêm một SET search_pathtruy vấn duy nhất. cảm ơn bạn!
hraban


4

giải pháp nhanh chóng có thể là:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";

0

Nếu chơi với psql bên trong docker thì thực hiện như sau:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.