为啥我的 psycopg2 查询因 `psycopg2.errors.InternalError_: Assert` 而失败?

Posted

技术标签:

【中文标题】为啥我的 psycopg2 查询因 `psycopg2.errors.InternalError_: Assert` 而失败?【英文标题】:Why is my psycopg2 query failing with `psycopg2.errors.InternalError_: Assert`?为什么我的 psycopg2 查询因 `psycopg2.errors.InternalError_: Assert` 而失败? 【发布时间】:2022-01-23 05:14:24 【问题描述】:

我在 Python 3.9 上运行 psycopg2,查询 Redshift 表。

我正在查询一个带有 SELECT * 传递给 cursor.execute() 方法的表:

query = 'select * from my_schema.my_table;'
cursor = connection.cursor(cursor_factory=RealDictCursor) # psycopg2 connection
cursor.execute(query)
data = cursor.fetchall()

而且,我得到了以下信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "mypython.py", <lines>
  File "/usr/local/lib/python3.9/site-packages/psycopg2/extras.py", line 236, in execute
    return super().execute(query, vars)
psycopg2.errors.InternalError_: Assert
DETAIL:
  -----------------------------------------------
  error:  Assert
  code:      1000
  context:   status == 0 - timestamp: '-9223372036854775808'
  query:     <query #>
  location:  cg_util.cpp:705
  process:   <process>
  -----------------------------------------------

我可以查询不同架构和相同架构的其他表,但不能查询这个表。

该表具有varchartimestamp 列类型。我在其中一列中使用了-infinity Special Date/Time Input。

【问题讨论】:

如果删除“cursor_factory=RealDictCursor”会发生什么? 【参考方案1】:

问题在于-infinity 时间戳值,psycopg2 似乎不同意它。

在这种情况下,我可以使用不同的内置值,因为我使用 -infinity 的实际原因是有一个表示“很久以前”的值。

update my_schema.my_table
set ts_column = timestamp 'epoch'
where my_table.ts_column = timestamp '-infinity';

【讨论】:

不,问题是 Python 不支持 +-infinity。如果您需要解决方案,请参阅此处Date adaptation 并查找“无限日期处理”部分。

以上是关于为啥我的 psycopg2 查询因 `psycopg2.errors.InternalError_: Assert` 而失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的查询因 SQLCODE = -420 而失败?

为啥 psycopg2 对我这么慢?

中断键时使用 psycopg2 终止未完成的 SQL 提交查询

为啥 psycopg2 INSERT 需要这么长时间才能循环运行,我该如何加快速度?

psycopg2 模块无法识别

为啥@jdbc 查询因连接超时而失败?