将 hypertable 转换为常规 postgres table

Convert hypertable to regular postgres table

对 timescaledb 很陌生,我正在努力处理迁移脚本。我正在尝试使用 SQLAlchemy 为烧瓶应用程序创建迁移。

假设我创建了一个 table(如 timescaledb 文档中所示),如下所示:

CREATE TABLE conditions (
  time        TIMESTAMPTZ       NOT NULL,
  location    TEXT              NOT NULL,
  temperature DOUBLE PRECISION  NULL,
  humidity    DOUBLE PRECISION  NULL
);

要添加 hypertable,我的升级迁移脚本应该这样做:

SELECT create_hypertable('conditions', 'time');

降级部分应该是什么样的? 来自 timescaledb docs,他们建议:

DROP table conditions;

但我不想删除整个 table,只删除 "hypertable" 部分(如果有意义的话)。也许这很愚蠢且毫无意义,我想通过我们的迁移提供一种摆脱 timescaledb 的方法。我已经读过这个 SO 问题:Creating Hypertables through SQL Alchemy 似乎没有为 SQLAlchemy 提供具体支持,他们建议创建 hypertables 而不是特定迁移的触发器。

你有什么建议?

您需要迁移和删除。 hypertable 不仅仅是我们在基础 table 之上附加的一些附加信息,它是数据的不同 partitioning/organization。

所以在上面的命令中,当你在创建 table 后立即调用 create_hypertable 时——你在 table 中还没有任何数据,所以我们只是改变模式定义等。但是,如果您在 table 上调用 create_hypertable,那 已经 有数据(使用 create_hypertable 的显式 migrate_data 参数 [1]命令),我们需要迁移数据(涉及将其从您现有的 table 复制到我们创建的新内部 chunks/tables。

因此,将其“迁移回”标准 table 将再次涉及在 hypertable 内部移动数据,因此这实际上类似于创建新标准 table,将数据从hypertable复制到标准table,然后删除hypertable。

[1] https://docs.timescale.com/api/latest/hypertable/create_hypertable/

正如 Mike 所说,hypertables 是一种完全不同的存储机制,这意味着您不能简单地关闭它们。相反,当您将带有数据的 table 转换为 hypertable 时,您需要将 table 从 hyper table.

中迁移出来
-- if you already have data in a table, you need to migrate that data
SELECT create_hypertable('conditions', 'time',  migrate_data => true);

您可以使用此处的任何答案来复制数据 但这是我在迁移降级过程中要做的事情。

CREATE TABLE pg_conditions (LIKE conditions INCLUDING ALL); -- duplicate table structure
INSERT INTO pg_conditions (SELECT * FROM conditions); -- copy all data
DROP TABLE conditions; -- drops hypertable
ALTER TABLE pg_conditions RENAME TO conditions; -- conditions is now a regular postgres table again