将字符串转换为日期时间时,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 中修复。
我可以想到两种可能的解决方法:
除了导入datetime,还导入了_strptime,虽然没有使用
import datetime
import _strptime
像这样使用函数:datetime.datetime.strptime('2019-12-11 08:58:01', '%Y-%m-%d %H:%M:%S')
我的目标是从 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 中修复。
我可以想到两种可能的解决方法:
除了导入datetime,还导入了_strptime,虽然没有使用
import datetime import _strptime
像这样使用函数:
datetime.datetime.strptime('2019-12-11 08:58:01', '%Y-%m-%d %H:%M:%S')