在 Postgresql 中将 CURRENT_DATE 设置为常量值以进行单元测试

lob*_*rus 2 python postgresql time unit-testing data-cleaning

我正在尝试为一个小脚本编写单元测试,该脚本会从 PostgreSQL 数据库表中删除所有超过 6 个月的条目。该脚本执行以下查询。

DELETE FROM some_table WHERE tstamp < (CURRENT_DATE - INTERVAL '180 days');
Run Code Online (Sandbox Code Playgroud)

该脚本是用Python编写的,我正在使用testing.postgresql创建一个我可以自由操作的本地临时数据库实例。我遇到的问题是,我无法找到一种方法来强制 CURRENT_DATE 为常量值,以便我可以创建特定日期之前和之后的测试条目,并且如果稍后运行测试,则不会更改。

是否可以覆盖 PostgreSQL 数据库中的 CURRENT_DATE 以始终返回预定义时间?

Pav*_*ule 6

您无法更改 CURRENT_DATE、CURRENT_TIMESTAMP。您的问题很常见,常见的解决方案很简单 - 在没有任何这些伪常量的部分和部分之间打破代码。

所以函数/查询

DELETE FROM some_table WHERE tstamp < (CURRENT_DATE - INTERVAL '180 days');
Run Code Online (Sandbox Code Playgroud)

不可测试,但可以运行

CREATE OR REPLACE FUNCTION delete_180days(_to_date date)
RETURNS void AS $$
  DELETE FROM some_table
    WHERE tstamp < ($1 - INTERVAL '180 days')
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

现在,我可以为 function 编写测试delete_180days。在应用程序中我可以使用它SELECT delete_180days(CURRENT_DATE)