我已经成功地使用了 Postgres 14,但现在我被难住了。我有一个abc包含表的数据库和架构。
\c abc
\dt -- shows tables
Run Code Online (Sandbox Code Playgroud)
我创建了一个新的数据库/架构xyz,但我看不到我创建的表:
\c xyc
\dt
Did not find any relations.
Run Code Online (Sandbox Code Playgroud)
如果我使用 PgAdmin4 我可以看到xyz的表格。如果我使用 DbVisualizer 我可以看到xyz的表格。但是,如果我使用psql我得到的所有内容,那么我是用户还是我自己(也是超级用户)Did not find any relations.
似乎并不重要。我在 PgAdmin4 中创建了这些表。这是一个错误吗?我尝试更改数据库或架构中所有对象的所有者,但无论我尝试什么,如果我使用.postgrespsqlxyzxyzpsql
不确定这是否有任何启发:
xyz-# \conninfo
You are connected to database "xyz" as user "postgres" via socket in "/tmp" at port "5432".
xyz=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | …Run Code Online (Sandbox Code Playgroud) 如何访问 中错误的数字代码psql?
例如,在本例中,我想获取值 23503(“foreign_key_violation”),如下所示: https: //www.postgresql.org/docs/current/errcodes-appendix.html
postgres=# insert into t values('bb');
ERROR: insert or update on table "t" violates foreign key constraint "fd"
-- How can I see the numeric error code here?
Run Code Online (Sandbox Code Playgroud) 我需要编写一个 shell/bash 脚本来自动更改一些 PostgreSQL 配置。
这是我写的命令:
sudo -u postgres psql -U postgres -d postgres -c "
ALTER SYSTEM SET listen_addresses = '127.0.0.1';
ALTER SYSTEM SET max_connections = '200';
ALTER SYSTEM SET shared_buffers = '24GB';
ALTER SYSTEM SET work_mem = '128MB';
...
"
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误:
ERROR: ALTER SYSTEM cannot run inside a transaction block
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个错误?
给定的 Oracle 查询通过替换变量将数据插入表中。我如何在 PostgreSQL 中实现相同的目标?
INSERT INTO control_threshold (
threshold_id, group_name, description, sql, low_value, high_value)
VALUES(
threshold_seq.nextval, '&2', '&1', TRIM('&5' || '&6' || '&7' || '&8' || '&9'),
trim('&3'), trim('&4'));
Run Code Online (Sandbox Code Playgroud) 这是有点恼人键入EXPLAIN (ANALYZE, BUFFERS, VERBOSE)的psql工具,当你每次优化查询。
那么,有没有办法以类似于它的方式定义别名(自动完成的会非常好)?psqlbash
例如FULLEXPLAIN SELECT * FROM pg_stat;结果为EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM pg_stat;
使用json数据类型时,有没有办法确保输入 JSON 必须有一个元素?
我的意思不是主要的,我希望插入的 JSON 至少具有id , name元素。它可以有更多,但至少这两个必须在那里。这能做到吗?
我正在使用脚本和 psql 运行多个查询。我还使用 COPY TO 命令将结果导出到 a.csv。但是,当我想将结果附加到 a.csv 时,这会覆盖文件 a.csv。
是否可以使用 COPY TO 语法,也许我缺少一些参数?还是我应该考虑使用其他工具?
在开发和测试期间,VALUES 文字表达式非常有用,因为它们使您能够在 SQL 查询中存储数据定义。
WITH foobar(foo, bar) AS (
VALUES
(1::integer,'a'::text),
(2,'b'),
(3,'c'),
(4,'d')
)
SELECT * FROM foobar;
Run Code Online (Sandbox Code Playgroud)
然而,当尝试使用非常宽或大的表时,这可能会变得乏味。如果这可以从现有表中生成,那就更令人沮丧了。
所以我有一种方法可以轻松地将行作为文字 VALUES 表达式复制/粘贴吗?
我能得到的最接近的是输出行作为记录
(请注意元数据,因为此 SQL 实际上尝试从给定的文字 VALUES 反向工程文字 VALUES)。
WITH foobar(foo, bar) AS (
VALUES
(1::integer,'a'::text),
(2,'b'),
(3,'c'),
(4,'d')
)
SELECT foobar::record FROM foobar;
Run Code Online (Sandbox Code Playgroud)
这是 psql 输出:
foobar
--------
(1,a)
(2,b)
(3,c)
(4,d)
(4 rows)
Run Code Online (Sandbox Code Playgroud)
然而,这需要额外的编辑来正确引用、键入和转义内容,所以我应该寻找格式化输出技巧还是 SQL 技巧?
编辑:当前的最佳答案已经非常好,但理想情况下,我想知道是否有通用方法来生成可以适应您可以抛出的任何记录类型的值表达式(即使它是带有随机数的复合行列)。
假设可以将其包装为如下函数:
row_to_values(IN myrowtype record, OUT myrowtype_as_literal_values text)
Run Code Online (Sandbox Code Playgroud)
在这个阶段,人们可能想知道“为什么不使用 row_to_json() ?” 是的,这可能是一个有效的替代方案,但我们正在偏离我想到的初始用例(快速生成用于测试/偶尔目的的 SQL),尽管使用 json 应该表现良好并且现在在 PostgreSQL 版本中广泛可用。
更好的是一个聚合函数,它直接输出一个干净的文本定义,在第一个 VALUE 上指定类型并添加列名作为别名(但在这个阶段,它几乎是一个功能提案,这里不是正确的地方,我没有人问对于这样的事情)。 …
psql\i命令能够执行给定的 SQL 脚本,但我需要一种将参数传递给脚本的方法。
示例:假设您有这个简单的脚本
select * from :table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
我试过了
my_db=> \i my-script.sql -v table="core.product"
Run Code Online (Sandbox Code Playgroud)
但出现这个错误
psql:my-script.sql:1: ERROR: syntax error at or near ":"
LINE 1: select * from :table LIMIT 1;
^
\i: extra argument "-v" ignored
\i: extra argument "table="core.product"" ignored
Run Code Online (Sandbox Code Playgroud)
我知道在终端上运行它会起作用,但我已经在 psql 中了。
psql -v table="core.product" -f my-script.sql
Run Code Online (Sandbox Code Playgroud) 是否可以在 Windows 上启用自动完成功能psql?据我从 Linux 用户那里了解到,他们可以使用按键TAB来自动完成,我想这非常方便。