您可以创建用户自定义操作,以定期在数据库上运行自定义函数或过程。

您可以使用 PostgreSQL 函数来创建通常需要多个查询或步骤的数据库操作。函数也可以被与数据库交互的其他应用程序使用,以执行任务而无需额外的代码。

您的函数需要包含在 CREATE 语句中。您也可以使用 CREATE OR REPLACE,尽管不推荐这样做。此语句还允许您在此语句中定义命令的语言。用户自定义操作可以使用您选择的任何语言编写。本指南使用 SQL 过程语言 PL/pgSQL

适用于用户自定义操作的函数的基本语法是

CREATE FUNCTION <function_name> (required arguments)
RETURNS <return_datatype> AS $<variable_name>$
DECLARE
<declaration>;
BEGIN
<function_body>;
RETURN { <variable_name> | value }
END; LANGUAGE <language>;

这是一个返回数据库中表的总行数的函数示例。

使用此代码创建函数。请注意,job_idconfig 是必需的参数。

CREATE FUNCTION totalRecords (job_id INT DEFAULT NULL, config JSONB DEFAULT NULL)
RETURNS integer AS $total$
declare
total integer;
BEGIN
SELECT count(*) into total FROM fill_measurements;
RETURN total;
END;
$total$ LANGUAGE plpgsql;

当您在 psql 中执行此代码时,它会返回 CREATE FUNCTION,表示已成功创建。然后,您可以像这样执行对函数的调用

select totalRecords();

结果如下所示

totalrecords
--------------
48600500
(1 row)

创建函数后,您需要将其注册到作业调度器,以使函数定期运行。您可以使用 add_job 函数来完成此操作。此示例添加了 totalRecords 函数,并指示它每小时运行一次

SELECT add_job('totalRecords', '1h', config => '{"hypertable":"metr"}');

对于 config 值,如果您不需要任何特殊的配置参数,可以使用 NULL

您可以通过查询作业调度器来查看当前注册的所有作业的列表,如下所示

SELECT * FROM timescaledb_information.jobs;

结果如下所示

job_id | application_name | schedule_interval | max_runtime | max_retries | retry_period | proc_schema | proc_name | owner | scheduled | config | next_start | hypertable_schema | hypertable_name
--------+----------------------------+-------------------+-------------+-------------+--------------+-----------------------+------------------+-----------+-----------+------------------------+-------------------------------+-------------------+-----------------
1 | Telemetry Reporter [1] | 24:00:00 | 00:01:40 | -1 | 01:00:00 | _timescaledb_internal | policy_telemetry | postgres | t | | 2022-08-18 06:26:39.524065+00 | |
1000 | User-Defined Action [1000] | 01:00:00 | 00:00:00 | -1 | 00:05:00 | public | totalrecords | tsdbadmin | t | {"hypertable": "metr"} | 2022-08-17 07:17:24.831698+00 | |
(2 rows)

TimescaleDB 本身包含一些作业调度策略,例如

如果这些策略不能满足您的用例,或者您想扩展原生策略功能,则可以编写用户自定义操作。

关键词

在此页面上发现问题了吗?报告问题 或 在 GitHub 上编辑此页面