4

timescaledb 很新,我正在为迁移脚本而苦苦挣扎。我正在尝试使用 SQLAlchemy 为烧瓶应用程序创建迁移。

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

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

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

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

降级部分应该是什么样子?从timescaledb docs,他们建议:

DROP table conditions;

但我不希望整个表都被删除,只有“hypertable”部分才有意义。也许这是愚蠢和毫无意义的,我想通过我们的迁移提供一种脱离 timescaledb 的方法。我已经阅读了这个 SO 问题:通过 SQL Alchemy 创建 Hypertables,其中似乎没有为 SQLAlchemy 提供特定支持,他们建议使用触发器来创建超表而不是特定迁移。

你有什么建议?

4

2 回答 2

3

您需要迁移和删除。超表不仅仅是我们粘贴在基础表之上的一些附加信息,它是数据的不同分区/组织。

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

因此,将其“迁移回”到标准表将再次涉及在超表内移动数据,因此它实际上类似于创建一个新的标准表,将数据从超表复制到标准表,然后删除超表。

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

于 2019-09-12T16:35:08.760 回答
1

正如 Mike 所说,hypertables 是一种完全不同的存储机制,这意味着您不能简单地关闭它们。相反,当您将包含数据的表转换为超表时,您需要将表从超表中迁移出来。

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

您可以使用此处的任何答案来复制数据https://stackoverflow.com/a/31284533/897414但这是我作为迁移降级的一部分要做的事情。

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
于 2022-01-04T15:49:18.633 回答