2016-09-26 46 views
0

我使用SqlAlchemy查詢Oracle數據庫並將結果存儲在csv文件中。SqlAlchemy Oracle DataTime格式

我想指定一個全球性的格式,以這樣寫日期:

'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

您能提供一個您通過SqlAlchemy發送到Oracle數據庫的代碼示例嗎?您是否可以選擇將轉換作爲Oracle查詢的一部分來處理,而不是在您的Python代碼中進行處理?提示如何做到這一點可以在這裏找到:https://stackoverflow.com/questions/26731319/datetime-on-where-clause-oracle?rq=1 – Projski

+0

我從另一個模塊獲取sql語句。然後執行它(result_proxy = connection.execute(request))。在sql語句中沒有格式。它只是選擇字段。我試圖執行:在連接到數據庫之後修改會話集NLS_DATE_FORMAT ='DD-MON-YYYY HH24:MI:SS',但它不會改變任何內容。 – stockersky

+0

由於我有大量的表格,我無法爲每個表格製作自定義代碼。它更像是從oracle模式中的每個表中選擇*並將每個錶轉儲爲不同的csv。 – stockersky

回答

0

我找到了解決這個問題的方法。

是的,將日期轉換爲具有適當格式的字符將工作。 但是,就我而言,SQL語句由另一個模塊提供,我需要處理超過一百個表。

因此,我決定使用execute()方法處理由SqlAlchemy返回的ResultProxy對象中包含的數據。

我一次以1000行的塊(塊是經典類型列表)獲取表。 但這些行是元組(更確切地說是一個SqlAlchemy RowProxy對象),它不能被修改。

因此,我有一種治療方法來將它們轉換爲有序的字典並更新塊列表。

使用'collections.OrderedDict'是很重要的,因爲它保持字段順序。 使用古典詞典時,字段標籤和值可能不匹配。

現在,我的塊已準備好進行各種處理(將日期更改爲具有適當格式的字符串,用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 

我不知道這是否是最有效的解決辦法,但表演好看。 我有一個這種治療(相同數據量)的版本,但使用熊貓庫,這是一個更長的時間來執行。