我想使用psycopg2在Python中运行PostgreSQL查询,它按timestamp without timezone
类型的列进行过滤。我有一个很长的时间戳(而不是一个范围)的允许值列表,psycopg2可以方便地处理数组,因此我认为这应该是可行的:
SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s)
times
参数是datetime
对象的列表。我也试过psycopg2.Timestamp()
。它们都转换为WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...])
,不幸的是,由于以下错误而失败:
我在pgAdmin中也证实了这一点,所以不仅仅是psycopg2。现在看来,Postgres不会隐式地将字符串数组转换为时间戳数组。如果我显式地将::timestamp
添加到pgAdmin中的每个元素,它将很好地转换一个字符串,数组也能正常工作,但我不知道如何在psycopg2中这样做。在
除了忘记DB-API参数和手动构建长时间戳字符串之外,最好的方法是什么?我有什么办法可以把它转换成正确的类型吗?在
试着这样做:
如果使用psycopg2版本2.2.0或更新版本,如果按照您的建议将值包装在
Timestamp()
构造函数中,则原始代码应该可以工作。在它以前不起作用的原因是psycopg2实现中的一个bug。建议的解决方法是在SQL中插入显式转换,如另一个答案中所建议的那样。在
相关问题 更多 >
编程相关推荐