SqlAlchemy Oracle DataTime格式

时间:2016-09-26 18:10:44

标签: python oracle datetime sqlalchemy

我使用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'。

1 个答案:

答案 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库,执行起来要长一点。