标签: psql

psql \e 的鲁莽行为

psql 13.2 退出编辑器时,无论退出编辑器后如何,都会执行查询缓冲区 - 在这种情况下,缓冲区现在可能保存最近执行的 SQL 查询。

重现:

  1. vim使用\e\e filenamepsql控制台启动编辑器(在我的情况下)。
  2. 输入与否,没有区别。
  3. 取消编辑:q(或:q!强制)

预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。

似乎发生了什么\e

  1. 它执行(相当于)\p,因此当前查询缓冲区包含前一个命令,当它为空时。(编辑文件时用户看不到!) 手册\p

    \p 或者 \print

    将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。

  2. 启动编辑器。如果提供了文件名,则加载文件,否则加载查询缓冲区。

  3. 如果编辑器以写入结束,则将结果复制到查询缓冲区。
    如果编辑被取消(:q在 vim 中),不要覆盖查询缓冲区。(它现在保存了之前的命令!)

  4. 执行查询缓冲区。或者,准确地说,这样做:

行为似乎可以\p(只是复制查询缓冲区,没有造成任何伤害),但不能\e执行,它可以执行我什至没有看到的命令。

这是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎不可能。或者我错过了什么?

postgresql psql

7
推荐指数
1
解决办法
187
查看次数

如何从 bash shell (PostgreSQL) 将环境变量传递到 sql 文件

我需要能够从.sql使用 .bashrc 执行文件的 bash shell 传递环境变量psql

psql我正在运行的命令是:

su postgres -c "psql -v ON_ERROR_STOP=1 -v dbname=example -v dbuser=example -e" < ./create-db.sql
Run Code Online (Sandbox Code Playgroud)

我放置的位置example通常分别设置为$DATABASE_NAMEDATABASE_USER,在执行命令之前在 bash 脚本中设置psql

create-db.sql文件是:

\connect postgres
DROP DATABASE IF EXISTS :dbname;
DO $$BEGIN
    CREATE USER :dbuser;
EXCEPTION WHEN duplicate_object THEN
    RAISE NOTICE 'user already exists';
END$$;
ALTER ROLE :"dbuser" SET search_path TO :"dbname",public;
CREATE DATABASE :"dbname"
    OWNER=:dbuser
    ENCODING=UTF8
    LC_COLLATE='en_US.UTF-8'
    LC_CTYPE='en_US.UTF-8'
    TEMPLATE=template0;
\connect :"dbname"
CREATE SCHEMA …
Run Code Online (Sandbox Code Playgroud)

postgresql psql bash

7
推荐指数
1
解决办法
6863
查看次数

PostgreSQL:更改 psql、createdb 等实用程序使用的默认端口

我在某些服务器上运行了2 个PostgreSQL实例。一个默认端口(5432)和端口5433.有些用户(和工艺)只需要进入二审(5433)其他实例上,我想设置它,这样,当这些用户使用的命令状psqlcreatedb在他们的 shell 中,它会自动将他们引导到正确的 Postgres 实例,而不是他们必须-p 5433随着每个命令一起输入。

我试图在 www.postgresql.org 上查找它,但找不到它……可能是我的错。有谁知道怎么做?

postgresql psql command-line

6
推荐指数
1
解决办法
1万
查看次数

在单引号字符串中添加变量值。在单引号内展开变量

我尝试了以下命令的不同变体,但不起作用。我只想使用位置字符串中的变量运行以下命令:

CREATE TABLESPACE data OWNER appuser
  LOCATION '/var/lib/pgsql95/:variable/pg_tblspc/data';
Run Code Online (Sandbox Code Playgroud)

已经尝试过的(变化):

EXECUTE CREATE TABLESPACE data OWNER appuser
  LOCATION ''/var/lib/pgsql95/' || base || '/pg_tblspc/data'';';
Run Code Online (Sandbox Code Playgroud)

PREPARE tablespace (text) AS
  CREATE TABLESPACE aspire_data OWNER aspireapp
  LOCATION '/var/lib/pgsql95/$1/pg_tblspc';

EXECUTE tablespace('base');
Run Code Online (Sandbox Code Playgroud)

\set myvariable 'base'
CREATE TABLESPACE aspire_data OWNER aspireapp
  LOCATION '/var/lib/pgsql95/':myvariable'/pg_tblspc';
Run Code Online (Sandbox Code Playgroud)

postgresql psql

6
推荐指数
1
解决办法
2820
查看次数

psql \copy 文件的相对路径?

我正在尝试创建一组脚本来修改 Postgres 9.6 数据库中的某些表。这些脚本存储在各种目录中,并依次从一个主协调器脚本调用。我正在 psql 中运行脚本。

在主脚本中,我用来\ir指定其他脚本的相对路径名。因此,我可以从任何地方运行 psql,并且主脚本将找到其他脚本。这按预期工作。

然而,在某些脚本中,我使用\copy命令从 CSV 文件加载数据。不幸的是,似乎输入文件名\copy始终被解释为相对于 psql 的当前工作目录,而不是相对于其脚本的目录,即使我\copy使用\ir.

例如,假设我从 开始psqlC:\并计划使用以下文件:

C:\
    dir1\
        script1.sql
        dir2\
            script2.sql
            input.csv
Run Code Online (Sandbox Code Playgroud)

我可以使用调用第一个脚本\ir dir1/script1.sql。效果很好。

此外,该脚本可以使用 调用第二个脚本\ir dir2/script2.sql。这也很好用。

问题是\copy第二个脚本中的命令:

\COPY foo.bar (col1) FROM 'input.csv' WITH (FORMAT CSV);
Run Code Online (Sandbox Code Playgroud)

input.csv除非存在于会话的当前目录中,否则此操作将失败psql。因此,我的问题是:

  • 有什么方法可以让我\COPY ... FROM从脚本内部调用命令,而不要求用户psql从相对于输入文件的特定目录运行会话?

我知道我可以使用绝对路径名,但在升级不同的部署时,我们将从各种不同的计算机/平台运行此脚本,因此在这种情况下没有可用的通用绝对路径。我正在寻找某种相对或可配置的路径解决方案。

先感谢您。

postgresql psql

6
推荐指数
1
解决办法
3万
查看次数

psql 没有提示我输入密码,然后拒绝访问

我在 Debian Linux 上使用 Postgres 9.4。我用一个用户创建了一个数据库,cindex可以访问该数据库。然而,当我尝试在命令行登录时,我什至没有提示输入密码:

myuser@myuserserver:~ $ psql -Ucindex cindex
psql: FATAL:  Peer authentication failed for user "cindex"
Run Code Online (Sandbox Code Playgroud)

我还需要做什么来启用用户?下面你可以看到我已经设置的权限:

postgres@myuserserver:~$ psql
psql (9.4.13)
Type "help" for help.

postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA cindex TO cindex;
GRANT
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 cindex    | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =T/postgres          +
           |          |          |             |             | postgres=CTc/postgres+
           |          | …
Run Code Online (Sandbox Code Playgroud)

postgresql permissions psql password

6
推荐指数
1
解决办法
6237
查看次数

pg_restore 错误:“关系不存在”并创建新数据库

我已经备份了我想要恢复到新数据库中的特定表,使用:

call pg_dump -Fc -h server -d database -U user -p password -v -f dump.sql -t public.table1 -t public.table2
Run Code Online (Sandbox Code Playgroud)

我没有问题。

然后我想通过使用 pg_restore 创建一个新数据库来恢复转储:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

这给了我一个“数据库临时不存在”的错误。据我所知,这应该已经创建了数据库并恢复了它。

但是,我然后手动创建“临时”数据库并运行:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

这将贯穿始终,但不会创建表并给我一个错误“ relation table1”和“ relation table2”不存在,并且只为两个表创建相应的 id_sewuences。

我真正想要的是不必手动创建新数据库,并且备份中的所有表都通过 pg_restore 使用以下命令恢复到全新的数据库中:

call pg_restore --clean --create -d temp -h server -p password -U user dump.sql
Run Code Online (Sandbox Code Playgroud)

据我了解。

请帮助,非常令人沮丧

postgresql psql pg-dump exists pg-restore

6
推荐指数
1
解决办法
1万
查看次数

GRANT ALL ON ALL TABLES IN SCHEMA 不允许用户查看表

我有一个非常简单的脚本来创建一个新数据库并创建一个新用户来访问这个数据库。这是由默认的 postgres 用户运行的。授予用户对数据库和模式的访问权限后,新创建的用户仍然无法看到\dtpsql 中使用的表。以下是脚本的一些片段,以显示我迄今为止尝试过的内容:

CREATE USER api WITH ENCRYPTED PASSWORD 'password';

ALTER DEFAULT PRIVILEGES 
    FOR USER api
    IN SCHEMA public
    GRANT ALL ON ALL TABLES TO api;


DROP DATABASE IF EXISTS new_db;
CREATE DATABASE new_db;


CREATE TABLE addresses (
    address_id INTEGER,
    address_line_1 VARCHAR(50) NOT NULL,
    address_line_2 VARCHAR(50),
    city VARCHAR(50) NOT NULL,
    state VARCHAR(2) NOT NULL,
    zipcode VARCHAR(12) NOT NULL,
    PRIMARY KEY (address_id)
);

-- Create more tables....

-- Added these in for good measure at the end:
GRANT …
Run Code Online (Sandbox Code Playgroud)

postgresql permissions psql users

6
推荐指数
1
解决办法
2万
查看次数

无法从 psql 诱导退出代码 3

文档页面国家(重点煤矿)

退出状态

如果 psql 正常完成,则向 shell 返回 0,如果发生自身的致命错误(例如,内存不足,找不到文件),则返回 1,如果与服务器的连接出现故障并且会话没有交互,则返回3,如果脚本中发生错误并且设置了变量 ON_ERROR_STOP。

但是,我似乎无法诱导退出代码 3。

bash-4.2$ uname -a
Linux mvpg-centos-76.vagrantup.com 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
bash-4.2$ psql --version
psql (PostgreSQL) 10.12
bash-4.2$ psql -v ON_ERROR_STOP=1 -c 'select 1/0;'
ERROR:  division by zero
bash-4.2$ echo $?
1
bash-4.2$ 
Run Code Online (Sandbox Code Playgroud)

我还在 FreeBSD 11.3 和 Darwin 19.3 上重现了这种行为。我是否误解了文档或使用了错误的语法?

postgresql psql

6
推荐指数
1
解决办法
447
查看次数

在“psql”中使用“\dp table_name”会抛出“运算符不唯一”

问题

我试图跑\dp heroes进去,psql但它立即抛出了以下内容!(heroes是表的名称)

ERROR:  operator is not unique: unknown || "char"
LINE 16:            E' (' || polcmd || E'):'
                          ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索并找到了这些,但我不清楚到底发生了什么!
参考:https://www.postgresql.org/message-id/2216388.1638480141@sss.pgh.pa.us

我已经尝试过了!

尝试使用架构名称访问它也不起作用

\dp public.heroes;
Run Code Online (Sandbox Code Playgroud)

初次阅读时,我认为我必须铸造它,但我认为我错了。

\dp heroes::"char";
Run Code Online (Sandbox Code Playgroud)

额外的东西

顺便说一句,仅供参考,这是一个作为 docker 容器运行的 Postgres 实例。

这是它内部生成的查询:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'm' THEN 'materialized …
Run Code Online (Sandbox Code Playgroud)

psql

6
推荐指数
1
解决办法
836
查看次数