我按照本教程的设置使用 Docker 安装了 timescaleDb:https://docs.timescale.com/self-hosted/latest/install/installation-docker/。我用了这张图片:
timescale/timescaledb-ha:pg14-latest
然后我使用 pgAdmin 连接到实例并按照官方教程进行操作:https://docs.timescale.com/getting-started/latest/tables-hypertables/.
CREATE DATABASE "test-timescale";
CREATE TABLE IF NOT EXISTS "Measurements" (
"Id" SERIAL PRIMARY KEY,
"DeviceId" VARCHAR(255) NOT NULL,
"SensorId" VARCHAR(255) NOT NULL,
"Timestamp" TIMESTAMPTZ NOT NULL,
"Temperature" DECIMAL(10, 2)
);
但是,当我尝试运行创建超表的命令时,出现错误,指出
by_range
函数不存在
SELECT create_hypertable('Measurements', by_range('Timestamp'));
错误:
LINE 1: SELECT create_hypertable('Measurements', by_range('Timestamp...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
我检查了是否已安装并创建了 timescaleDb 扩展。还尝试将引号更改为双打,但没有成功。
我在这里缺少什么?
所以我犯了一些错误。首先,我的表以大写字母命名,这只会在 Postgresql 中带来额外的麻烦,我需要将变量用双引号括在单引号内(例如“测量”)。其次,我在
Id
中添加了一个主键约束,这使得该函数无法创建必要的表。
所以我使用了一个解决方法:
SELECT create_hypertable('measurements', 'Timestamp', if_not_exists => TRUE, chunk_time_interval => INTERVAL '1 day');
此命令现在有效,我已成功创建超表。
但是我仍然对为什么
by_range
功能不能像文档中描述的那样开箱即用。如果有人能澄清这一点,我会很高兴。
您可能尝试在早期版本上使用 TimescaleDB 2.13+ 语法。您可以恢复到旧的。请注意区分大小写。 db<>fiddle 的演示:
alter table "Measurements" drop constraint "Measurements_pkey";
SELECT create_hypertable('"Measurements"', 'Timestamp');
运行此程序时,
"Id"
不能是主键,因为这意味着它本身是唯一的; Timescale 要求,如果存在唯一约束,则分区键需要成为其中的一部分。