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

Setting CURRENT_DATE to constant value in Postgresql for unit testing

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

DELETE FROM some_table WHERE tstamp < (CURRENT_DATE - INTERVAL '180 days');

脚本在 Python 中,我正在使用 testing.postgresql 创建一个我可以自由操作的本地临时数据库实例。我遇到的问题是我找不到一种方法来强制 CURRENT_DATE 成为一个常量值,这样我就可以创建某个日期之前和之后的测试条目,并且如果测试是 运行 稍后。

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

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

所以function/query

DELETE FROM some_table WHERE tstamp < (CURRENT_DATE - INTERVAL '180 days');

不可测试,但功能

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

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