我找到了解決這個問題的方法。
是的,將日期轉換爲具有適當格式的字符將工作。 但是,就我而言,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
我不知道這是否是最有效的解決辦法,但表演好看。 我有一個這種治療(相同數據量)的版本,但使用熊貓庫,這是一個更長的時間來執行。
您能提供一個您通過SqlAlchemy發送到Oracle數據庫的代碼示例嗎?您是否可以選擇將轉換作爲Oracle查詢的一部分來處理,而不是在您的Python代碼中進行處理?提示如何做到這一點可以在這裏找到:https://stackoverflow.com/questions/26731319/datetime-on-where-clause-oracle?rq=1 – Projski
我從另一個模塊獲取sql語句。然後執行它(result_proxy = connection.execute(request))。在sql語句中沒有格式。它只是選擇字段。我試圖執行:在連接到數據庫之後修改會話集NLS_DATE_FORMAT ='DD-MON-YYYY HH24:MI:SS',但它不會改變任何內容。 – stockersky
由於我有大量的表格,我無法爲每個表格製作自定義代碼。它更像是從oracle模式中的每個表中選擇*並將每個錶轉儲爲不同的csv。 – stockersky