如何为时间戳(日期时间)数组指定psycopg2参数

2024-10-01 19:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{pr2}$

我在pgAdmin中也证实了这一点,所以不仅仅是psycopg2。现在看来,Postgres不会隐式地将字符串数组转换为时间戳数组。如果我显式地将::timestamp添加到pgAdmin中的每个元素,它将很好地转换一个字符串,数组也能正常工作,但我不知道如何在psycopg2中这样做。在

除了忘记DB-API参数和手动构建长时间戳字符串之外,最好的方法是什么?我有什么办法可以把它转换成正确的类型吗?在


Tags: 字符串类型列表参数postgresql时间any数组
2条回答

试着这样做:

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

如果使用psycopg2版本2.2.0或更新版本,如果按照您的建议将值包装在Timestamp()构造函数中,则原始代码应该可以工作。在

它以前不起作用的原因是psycopg2实现中的一个bug。建议的解决方法是在SQL中插入显式转换,如另一个答案中所建议的那样。在

相关问题 更多 >

    热门问题