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 以始终返回预定义时间?
您无法更改 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)