cursor.fetchall() 期间出现 psql 转换解析错误

psql cast parse error during cursor.fetchall()

我有一个 python 代码,它使用 cursor.fetchall() 查询 psql 和 returns 一批结果。 如果由于数据库中的数据错误而导致转换失败,它会抛出异常并使过程失败。 我得到这个例外:

File "/usr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py", line 377, in fetchall return [self._build_row() for _ in xrange(size)] File "/usr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py", line 891, in _build_row self._casts[i], val, length, self) File "/usr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/typecasts.py", line 71, in typecast return caster.cast(value, cursor, length) File "/usr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/typecasts.py", line 39, in cast return self.caster(value, length, cursor) File "/usr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/typecasts.py", line 311, in parse_date raise DataError("bad datetime: '%s'" % bytes_to_ascii(value)) DataError: bad datetime: '32014-03-03'

有没有办法告诉施法者忽略这个错误并将其解析为字符串而不是使整个批次失败?

将您的 psql 查询更改为转换并获取日期列作为字符串

例如select date_column_name:: to_char 来自 table_name.

您可以 "hack" psycopg2cffi 的解析器改为 return DATE 对象作为字符串:

如果您查看 code,您可以看到 DATE 解析器的注册,因此您可以在代码中替换 DATE 的序列化程序。

import psycopg2cffi

psycopg2cffi._impl.typecasts._default_type('DATE', [1082],
                                  psycopg2cffi._impl.typecasts.parse_string)

当然,对于每种类型都可以这样做。