将字符串转换为日期时间时,Cursor 的 iterate() 方法有时会失败

Cursor's iterate() method sometimes fails when converting a string to datetime

我的目标是从 Vertica 获取行,其中包含类型为 Timestamp 的列,格式为 YYYY-MM -DD HH:MM:SS,和他们一起做事。 我的问题是 cursor.iterate() 函数有时会抛出错误,我不知道为什么。 非常重要的一点是我正在使用 vertica_python 库。

错误信息:

(<type 'exceptions.AttributeError'>, AttributeError('_strptime',), <traceback object at 0x7f9f2fc29ef0>)`

**Traceback:** 
`Traceback (most recent call last):
  File "/root/..../sync.py", line 129, in fetch_exception_table
    for row in cur.iterate():
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/cursor.py", line 363, in iterate
    row = self.fetchone()
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/cursor.py", line 267, in fetchone
    row = self.row_formatter(self._message)
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/cursor.py", line 446, in row_formatter
    return self.format_row_as_array(row_data)
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/cursor.py", line 462, in format_row_as_array
    for idx, value in enumerate(row_data.values)]
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/column.py", line 212, in convert
    return self.converter(s) if self.converter is not None else s
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/column.py", line 77, in timestamp_parse
    dt = _timestamp_parse(s)
  File "/usr/lib/python2.7/site-packages/vertica_python/vertica/column.py", line 94, in _timestamp_parse
    return datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')
AttributeError: _strptime`

我的代码:

        csv_buffer1 = cStringIO.StringIO()

        connection = Connection(config)
        cur = connection.get_cursor()

        cur.execute("select {} from DB.Table order by column;"
                    .format(HEADER_COLUMNS))

        for row in cur.iterate():
            csv_buffer1.write(tabulate(row, lsp=True))

我的连接class:

from vertica_python import connect

class Connection:
    cur = None

    def __init__(self, config):
        self.config = config
        self.connObject = connect(**dict(config.items()))

    def get_cursor(self):
        self.cur = self.connObject.cursor()
        return self.cur
    #todo - return self.conn.... directly

    def close_connection(self):
        self.connObject.close()

在上面的代码中,for 循环执行失败。

出于某种原因,代码并不总是失败,它有时会成功运行,有时却不会。

Vertica DB中的数据请看下图:

Vertica Timestamp column

此外,为了调试而使用cur.fetchall()cur.fetchone()而不是cur.iterate()是没有意义的,因为它们都使用[中的相同功能=59=]column.py.

这个问题是由于我的代码中使用了多线程造成的。 _strptime 在某些代码执行中的导入被锁定或被另一个线程使用,因此请求它的第二个线程导入失败。

这在 Python3 中还没有发生在我身上,所以我认为它已在 Python3 中修复。

我可以想到两种可能的解决方法:

  1. 除了导入datetime,还导入了_strptime,虽然没有使用 import datetime import _strptime

  2. 像这样使用函数:datetime.datetime.strptime('2019-12-11 08:58:01', '%Y-%m-%d %H:%M:%S')