将 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
对 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