如何从 Postgres 中的 json(b) 对象中提取/获取/选择“子对象”?
似乎有很多信息几乎可以让我到达那里,但又不完全是。很多关于转换为记录、过滤然后从中构建新对象的内容。说实话,我真的很惊讶这不是内置功能。也许有一种简单的方法可以通过组合内置 fns 来实现此目的?我正在寻找的本质上相当于select-keys;一个函数(比如jsonb_select_keys)给出了这个:
SELECT jsonb_select_keys('{"a":42,"b":43,"c":44,"d":97}', '{a,d,e}');
Run Code Online (Sandbox Code Playgroud)
会返回这个:
{"a":42,"d":97}
Run Code Online (Sandbox Code Playgroud)
有点像jsonb_path_query_array,但针对的是 kv 对而不是值。
如果我运行以下命令
VACUUM myTable;
Run Code Online (Sandbox Code Playgroud)
这被记录在 postgres 系统表中,可以通过以下命令查看
select last_vacuum, vacuum_count from pg_stat_all_tables where relname= 'mytable';
Run Code Online (Sandbox Code Playgroud)
然而,这样做VACUUM FULL似乎没有被记录下来。
我如何知道最后一次VACUUM FULL对表运行的时间?
我知道,在 PostgreSQL 中,返回值NOW()是事务开始时间戳。因此,如果您NOW()在同一事务中多次使用,它将始终返回相同的值。
这在我的书中是很好的。
但是我在客户端应用程序中的单元测试方面遇到了一个小问题,并且希望能够告诉 PostgreSQL 如果可能的话(暂时)禁用它。
我不想(不能)使用另一个时间戳函数的原因是clock_timestamp()因为函数调用NOW()位于触发器内部,并且在生产代码中我想要“事务开始”行为。
但在我的单元测试中,我正在修补 API 级“提交”功能,这样我就不会在测试期间意外地将真实数据提交到数据库(不用担心,我在测试期间不使用生产数据库)。因此,在单元测试期间,commit永远不会访问数据库,因此我没有获得新的事务时间戳。
数据库使用时态表,如果时间戳发生更改,新条目仅会附加到历史表中,以确保每个事务仅合并历史表中的一个条目。
但是,当测试时态表行为时,这会导致历史表中不会出现任何条目。时态表触发器的关键片段是这样的:
new_validity_period = tstzrange(
lower(OLD.validity_period),
NOW(),
'[)'
);
IF isempty(new_validity_period) THEN
RAISE DEBUG 'New entry % will not introduce a new history item', OLD;
RETURN OLD;
END IF;
Run Code Online (Sandbox Code Playgroud)
因此,当我在单元测试中执行“插入”操作,且交易时间为“2020-01-01 01:02:03”时,该条目的有效期将为[2020-01-01 01:02:02,)。如果仍然在同一个单元测试中,我删除该条目(并测试它是否出现在历史表中),则该操作发生在同一个 TX 中,上面的代码将如下所示:
new_validity_perion = tstzrange(
'2020-01-01 01:02:03', -- the lower-bound of the 'OLD' row
'2020-01-01 01:02:03', -- the result of …Run Code Online (Sandbox Code Playgroud) 想象一下具有 1:M 关系的多个父子表。我想“级联” - 根据根父表行选择插入重复行。每个表都有IDENTITY主键,每个子表都有其父 ID 的 FK(上一级)。
给定根父表 ID,为其及其所有子表插入重复行。
我尝试了“级联”插入 CTE,但遇到了RETURNING仅限返回插入数据的问题,而我需要额外的信息来连接下一个INSERT.
我通过添加额外的列 ( ) 来完成此任务copied_from_id。
有没有办法在没有额外列的情况下完成相同的任务?
我确实看到了@Erwin Brandstetter 的这个答案,但他的例子只有 1 个父母和孩子,我不知道如何将其扩展到多个级别
这是示例 DDL 和 DML 来说明问题
--DROP TABLE IF EXISTS lvl_one,lvl_two,lvl_three CASCADE;
CREATE TABLE IF NOT EXISTS public.lvl_one (
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
name text,
CONSTRAINT lvl_one_pk …Run Code Online (Sandbox Code Playgroud) 我们有这个漂亮的 Postgres 树生成器。然而,它会产生一棵树的切口,而不是一次产生整棵树:
item_id jsonb_pretty
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.2",
"item_id": 6
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": 3,
"children": {
"title": "LEVEL 4.1",
"item_id": 4
}
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": …Run Code Online (Sandbox Code Playgroud) 我使用 PostgreSQL 13(最新的 dockerized)进行了简单的设置:
CREATE TABLE stop (
id INT UNIQUE,
name TEXT,
PRIMARY KEY(id)
);
CREATE TABLE line (
id INT UNIQUE,
name TEXT,
PRIMARY KEY(id)
);
CREATE TABLE line_stops_sequence(
id SERIAL PRIMARY KEY,
line INT,
stop INT,
CONSTRAINT fk_line FOREIGN KEY(line) REFERENCES line(id),
CONSTRAINT fk_stop FOREIGN KEY(stop) REFERENCES stop(id)
);
Run Code Online (Sandbox Code Playgroud)
当我启动下面这句话时
INSERT INTO line(id, name) VALUES (1, 'Line 1');
INSERT INTO stop(id, name) VALUES (2, 'Stop 2');
INSERT INTO line_stops_sequence(line, stop) VALUES (1,1), (1,2) ON CONFLICT ON CONSTRAINT …Run Code Online (Sandbox Code Playgroud) 当我尝试将转储文件恢复到另一个(本地)PostgreSQL 服务器(在 Debian GNU/Linux 10.10 上运行)时,出现以下错误:
\npg_restore: error: could not execute query: ERROR: option "locale" not recognized\nRun Code Online (Sandbox Code Playgroud)\n因为它确实有以下行:
\nCREATE DATABASE "REMOTE_DB" WITH TEMPLATE = template0 ENCODING = \'UTF8\' LOCALE = \'en_GB.UTF-8\';\nRun Code Online (Sandbox Code Playgroud)\n是的,我知道PostgreSQL 12 CREATE DATABASE命令没有选项LOCALE。
我不明白的是:
\npg_dump我在本地服务器上使用的版本报告为 12.7pg_restore我在本地服务器上使用的版本报告为 12.7pg_dump是版本 12.7,而不是 13。让我一一验证一下:
\n我的本地服务器:
\n$ sudo -u postgres …Run Code Online (Sandbox Code Playgroud) 我使用的是 postgres 13.3,并且我已经有一个现有的表,其中有一GENERATED列,例如:
CREATE TABLE test_table (
id uuid NOT NULL DEFAULT uuid_generate_v4(),
the_column_to_alter bool NOT NULL GENERATED ALWAYS AS (2 > 1) STORED,
CONSTRAINT test_table2_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
但我现在改变了主意,我希望它只是一个常规的非生成列,我可以手动编辑......
DROP创建该列这可能吗?ALTER对列执行此操作的查询是什么the_column_to_alter?
运行时:
REINDEX DATABASE CONCURRENTLY mydb;
Run Code Online (Sandbox Code Playgroud)
这可能需要几个小时,甚至几天,具体取决于数据库的大小,是否有办法粗略估计其进度?
我看到一些论坛帖子声称您可以使用如下查询来查询索引创建状态:
SELECT
now()::TIME(0),
a.query,
p.phase,
p.blocks_total,
p.blocks_done,
p.tuples_total,
p.tuples_done,
FROM pg_stat_progress_create_index p
JOIN pg_stat_activity a ON p.pid = a.pid;
Run Code Online (Sandbox Code Playgroud)
_done / _total 列与阶段相结合确实提供了粗略的进度百分比。但是,这仅列出当前更新索引的进度。它不会告诉您有多少其他索引正在等待更新,更不用说每个索引需要做多少工作了。
编辑:我尝试将 views 结合起来pg_index,其中列出了*_ccnew并发进程使用的临时索引,例如pg_stat_progress_create_index:
SELECT relname,
CASE WHEN blocks_total > 0 THEN (ci.blocks_done/ci.blocks_total::numeric*100)::int ELSE NULL END as blocks_percent,
i.*
FROM pg_class as pgc
inner join pg_index as i on i.indexrelid = pgc.oid
left outer join pg_stat_progress_create_index as ci on ci.index_relid = i.indexrelid
WHERE i.indisvalid = false; …Run Code Online (Sandbox Code Playgroud) 想象一个视图,其中包含来自两个不同表的COALESCE两varchar列。
底层证券varchars在两个表中都有索引。
在 Postgres 11.6 中,根据结果过滤此视图COALESCE不使用索引,而是进行表扫描。
但是,如果我将列更改为text,在同一列上过滤完全相同的视图,则索引将按您的预期使用。
假设我有一个一些标识符随时间变化的测量值表。还有一个几乎相同的表,其中包含估计值:
CREATE TABLE measured (
id int,
ts timestamp,
identifier character varying,
measured_value int
);
CREATE INDEX ON measured(identifier);
CREATE TABLE estimated (
id int,
ts timestamp,
identifier character varying,
estimated_value int
);
CREATE INDEX ON estimated(identifier);
Run Code Online (Sandbox Code Playgroud)
每个表有 100 万行数据:
INSERT INTO measured
SELECT
generate_series(1, 1000000),
to_timestamp((random() * 100000)::int),
left(md5(random()::text), 2),
random() * 10;
INSERT INTO estimated
SELECT
generate_series(1, 1000000),
to_timestamp((random() * …Run Code Online (Sandbox Code Playgroud) postgresql varchar execution-plan index-tuning postgresql-performance
postgresql ×10
cte ×2
insert ×2
json ×2
alter-table ×1
constraint ×1
errors ×1
functions ×1
index ×1
index-tuning ×1
pg-dump ×1
pg-restore ×1
recursive ×1
timestamp ×1
tree ×1
varchar ×1