2016-09-26 10 views
0

SqlAlchemyを使用してOracleデータベースを照会し、結果をcsvファイルに格納します。SqlAlchemy Oracle DataTime形式

私はこのように書かれる日付の世界的な形式を指定したいと思います:

'DD-MM-YYYY HH24:MI:SS'. 

私はシステム上NLS_DATE_FORMATをこのように設定しています。 exempleについては

datetime.datetime(2016, 12, 22, 13, 12, 35) 

終わるだろう:

2004-12-22 13:12:35 

は私が希望:

22-12-2004 13:12:35 

私はテーブルの何百ものプロセスとして、私は 'strftimeの' "を適用することはできません手動で "

+0

SqlAlchemy経由でOracleデータベースに送信するコードのサンプルを提供できますか? Pythonコードではなく、Oracleクエリーの一部として変換を処理するオプションはありますか?これを行う方法のヒントはここにあります: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スキーマ内のすべてのテーブルからselect *のようになり、各テーブルを個別のcsvにダンプします。 – stockersky

答えて

0

私はこの問題を解決する方法を見つけました。

はい、日付を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ライブラリを使用すると、実行に少し時間がかかります。

関連する問題