私はこの問題を解決する方法を見つけました。
はい、日付をcharに変換して、適切な書式を設定すると正しく動作します。 私の場合、SQL文は別のモジュールによって提供されており、私は100以上のテーブルを処理する必要があります。
私は、execute()メソッドでSqlAlchemyから返されたResultProxyオブジェクトに含まれるデータを扱うことにしました。
一度に1000行のチャンク(チャンクはクラシックタイプのリスト)でテーブルをフェッチします。 しかし、これらの行は一種のタプル(より正確にはSqlAlchemy RowProxyオブジェクト)であり、変更することはできません。
私は順序付けられた辞書でそれらをキャストし、チャンクリストを更新する処置をしました。
'collections.OrderedDict'は、フィールドの順序を保持するため重要です。 古典的なdicでは、フィールドのラベルと値が一致しないことがあります。
私のチャンクは、あらゆる種類の処理(日付を適切な書式設定で変更し、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ライブラリを使用すると、実行に少し時間がかかります。
SqlAlchemy経由でOracleデータベースに送信するコードのサンプルを提供できますか? Pythonコードではなく、Oracleクエリーの一部として変換を処理するオプションはありますか?これを行う方法のヒントはここにあります: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スキーマ内のすべてのテーブルからselect *のようになり、各テーブルを個別のcsvにダンプします。 – stockersky