我想使用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', ...]) 不幸的是,由于以下错误失败:

operator does not exist: timestamp without time zone = text
LINE 3: WHERE thetimestamp = ANY (ARRAY['2009-07-06T00:00:00', '2009-07-07T00:00:00', ...]
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

我也在pgadmin中确认了这一点,因此不仅仅是psycopg2。似乎正在发生的事情是,Postgres不会隐式将一系列字符串转换为一系列时间戳。如果我明确添加 ::timestamp 对于pgadmin中的每个元素,但我不知道如何在psycopg2中做到这一点。

除了忘记DB-API参数并手动构建长的时间戳之外,最好的方法是什么?有什么办法可以让它铸造为正确的类型?

有帮助吗?

解决方案

这样尝试:

SELECT somestuff
FROM mytable
WHERE thetimestamp = ANY (%(times)s::timestamp[])

其他提示

如果您使用Psycopg2版本2.2.0或更新,则原始代码应该可用,如果将这些值包裹在 Timestamp() 正如您所建议的。

以前无法使用的原因是Psycopg2实现中的一个错误。建议的解决方法是将明确的铸件插入SQL,如另一个答案中所建议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top