SQLAlchemy在执行查询中缓存now()

时间:2016-06-14 18:59:32

标签: python postgresql sqlalchemy

最小测试用例:

db = sqlalchemy.create_engine('postgres://foo@localhost/bar')
con=db.connect()
con.execute("select now();").first()
sleep(60)
con.execute("select now();").first()

两个execute语句返回相同的值,即使是什么时间"现在"已经改变了。我认为这是我运行db.connect()的时候。

我还使用了

形式的查询
select * from table where ts > (now() - interval '1 hour');

他们表现出类似的问题。如果我添加具有最近时间戳的行,它们就会显示出来。因此,现在()的值被缓存了。实际查询正在重新执行。这只是错误的查询。

如何关闭此功能?

1 个答案:

答案 0 :(得分:3)

PostgreSQL中的当前时间戳有different functions。来自文档:

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()
     

transaction_timestamp()相当于CURRENT_TIMESTAMP,但是。{   命名以清楚地反映它返回的内容。 statement_timestamp()   返回当前语句的开始时间(更具体地说,   从客户端收到最新命令消息的时间)。   statement_timestamp()transaction_timestamp()返回相同内容   在事务的第一个命令期间的值,但可能不同   在后续命令中。 clock_timestamp()返回实际值   当前时间,因此即使在单个SQL中它的值也会发生变化   命令。 timeofday()是历史PostgreSQL函数。喜欢   clock_timestamp(),它返回实际的当前时间,但是作为a   格式化文本字符串,而不是带有时区值的时间戳。   now()是传统的PostgreSQL等价物   transaction_timestamp()

您可能想要statement_timestamp()