我使用SqlAlchemy查询Oracle数据库并将结果存储在csv文件中。
我想指定日期的全局格式,如下所示:
'DD-MM-YYYY HH24:MI:SS'.
我已在系统上以这种方式设置NLS_DATE_FORMAT。
例如:
datetime.datetime(2016, 12, 22, 13, 12, 35)
会结束:
2004-12-22 13:12:35
我想:
22-12-2004 13:12:35
当我处理数百个表时,我无法“手动”应用'strftime'。
答案 0 :(得分:0)
我找到了解决这个问题的方法。
是的,将日期转换为具有适当格式的字符将起作用。 但是,就我而言,SQL语句由另一个模块提供,我需要处理超过一百个表。
因此,我决定使用execute()方法处理SqlAlchemy返回的ResultProxy对象中包含的数据。
我一次获取1000行(chunk是经典类型列表)的表。 但是这些行是一种元组(更准确地说是一个SqlAlchemy RowProxy对象)并且它不能被修改。
所以,我有一种治疗方法可以将它们投射到有序的词典中并更新块列表。
使用' collections.OrderedDict'因为它保持字段顺序。 使用经典的dic,然后字段标签和值可能不匹配。
现在,我的块已准备好进行各种处理(将Dates更改为具有适当格式的字符串,在VARCHAR字符串中替换char等等)。字典结构非常适合。
注意,在写入之前,必须回滚块列表中的OrderedDic行。
这是一个简化的例子:
result_proxy = connection.execute(request)
while True:
chunk = self.result_proxy.fetchmany(1000)
if not chunk:
break
# treatments comes here after :
# 1- transform into a dic in order to be able to modify
for i, row in enumerate(chunk):
chunk[i] = OrderedDict(row)
# 2- clean dates
for i, row_odic in enumerate(chunk):
for item in row_odic:
if(type(row_odic[item]) is datetime.datetime):
row_odic[item] = str(row_odic[item].strftime("%d/%m/%Y"))
chunk[i] = row_odic
# Other data treatment
# cast back for it to look like a classical result :
for c, row_odic in enumerate(chunk):
self.chunk[c] = row_odic.values()
# finally write row_odic.values in the csv file
我不确定它是否是最有效的解决方案,但性能看起来不错。 我有一个这种处理的版本(相同数量的数据),但使用Pandas库,执行起来要长一点。