使用psql时如何在postgres中选择模式?

meh*_*any 120 postgresql psql

我有一个包含多个模式的postgres数据库.当我从shell连接到数据库时psql,我运行\dt它使用默认的公共连接模式.是否有我可以指定的标志或如何更改架构?

Cir*_*ini 152

在PostgreSQL中,系统通过遵循搜索路径来确定表示哪个表,搜索路径是要查看的模式列表.

搜索路径中的第一个匹配表被视为所需的匹配表,否则,如果没有匹配则引发错误,即使数据库中的其他模式中存在匹配的表名.

要显示当前搜索路径,可以使用以下命令:

SHOW search_path;
Run Code Online (Sandbox Code Playgroud)

要将新架构放在路径中,您可以使用:

SET search_path TO myschema;
Run Code Online (Sandbox Code Playgroud)

或者如果你想要多个模式:

SET search_path TO myschema, public;
Run Code Online (Sandbox Code Playgroud)

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


小智 68

你想改变数据库吗?

\l - to display databases
\c - connect to new database
Run Code Online (Sandbox Code Playgroud)

更新.

我再读一遍你的问题.显示模式

\dn - list of schemas
Run Code Online (Sandbox Code Playgroud)

要更改架构,您可以尝试

SET search_path TO
Run Code Online (Sandbox Code Playgroud)


kli*_*lin 24

在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
Run Code Online (Sandbox Code Playgroud)

显示关系列表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)
Run Code Online (Sandbox Code Playgroud)

显示test_schema.test_table定义:

test=# \d test_schema.test_table
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
Run Code Online (Sandbox Code Playgroud)

显示所有表格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 | 
Run Code Online (Sandbox Code Playgroud)

等等...

  • 我错过了\ dt test_schema之后的时期.这导致"没有关系发现消息"感谢您的示例,使它更容易:) (6认同)
  • 看来 PG14 它需要是 `\dt schema.*` 或 `\dv schema.*`,因此在句号后需要 `*` :shrug: (3认同)

Moh*_*eer 22

\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'.
Run Code Online (Sandbox Code Playgroud)

  • 不要像我一样忘记模式名称后面的句点:)(谢谢你,穆罕默德!) (48认同)
  • PostgreSQL 14.1:您必须在句号后添加一个星号。就像`\dt schema1.*` (37认同)
  • 这并不能回答问题。他询问如何更改默认架构。不是 psql 的基本命令。 (2认同)
  • OP 抱怨他无法使用 \dt 列出特定模式中的表,这个答案实际上是最接近回答问题的答案。帖子标题需要改进,以包含问题是关于 \d 的。 (2认同)
  • 额外的 * 是为我修复的 100% 清楚: - `\dt schema1.` 不起作用 - `\dt schema1.*` 起作用 (2认同)

小智 17

如果你在 psql 中输入

set schema 'temp';
Run Code Online (Sandbox Code Playgroud)

然后 \d 显示“temp”中的所有关系

  • 我发现通过环境设置连接参数是快速更改数据库的最有效方法,你猜怎么着,你可以通过 PGOPTIONS 环境变量设置 schema:`PGOPTIONS="-c search_path=schemaname" psql`!呜呼! (4认同)
  • 请注意,上面的命令只是“SET search_path TO temp;”的别名 (2认同)

tec*_*ags 10

这是旧的,但我将导出放在我的别名中以连接到db:

alias schema_one.con="PGOPTIONS='--search_path=schema_one' psql -h host -U user -d database etc"
Run Code Online (Sandbox Code Playgroud)

对于另一个架构:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"
Run Code Online (Sandbox Code Playgroud)

  • 好主意。我会在您的别名中省略`export`和分号。这样,退出psql后,`PGOPTIONS`不会停留在周围。 (2认同)

小智 9

关键词:

SET search_path TO
Run Code Online (Sandbox Code Playgroud)

例子 :

SET search_path TO your_schema_name;
Run Code Online (Sandbox Code Playgroud)


Sta*_*lav 8

快速解决方案可能是:

SELECT your_db_column_name from "your_db_schema_name"."your_db_tabel_name";
Run Code Online (Sandbox Code Playgroud)