【问题标题】:psql cast parse error during cursor.fetchall()cursor.fetchall() 期间的 psql cast 解析错误
【发布时间】:2016-01-27 09:55:31
【问题描述】:

我有一个 python 代码,它查询 psql 并使用 cursor.fetchall() 返回一批结果。 如果由于数据库中的错误数据而导致强制转换失败,它会引发异常并导致进程失败。 我得到了这个例外:

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'

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

【问题讨论】:

    标签: python python-2.7 psycopg2 psql


    【解决方案1】:

    您可以“破解”psycopg2cffi 的解析器以将 DATE 对象作为字符串返回:

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

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

    这当然可以,适用于每种类型。

    【讨论】:

      【解决方案2】:

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

      例如从 table_name 中选择 date_column_name::to_char。

      【讨论】:

      • 感谢您的快速回复!第二个解决方案是我正在尝试做的,但psycopg2cffi 是我正在使用的python 库,如果我在代码中发现异常,那么fetchall() 将不会被完全执行并保持为空跨度>
      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多