6

バックグラウンド

PythonとPeeweeで作成されたMySQLクエリの結果をデータベースの列ヘッダーを含むExcelファイルにダンプする方法を探しています。エクスポートされたコンテンツを、データベースの列とほぼ同じ順序で配置したいと思います。さらに、フィールドがわずかに異なる可能性のある複数の類似したデータベース間でこれを機能させる方法が必要です。明確にするために、1つのデータベースには「User、PasswordHash、DOB、[...]」を含むユーザーテーブルがあり、別のデータベースには「User、PasswordHash、Name、DOB、[...]」があります。

問題

私の主な問題は、列ヘッダーを順番に表示することです。これまでのすべての試みは、順序付けられていない結果をもたらしましたが、そのすべてはそれほどエレガントではありません。

第二に、これまでの私の方法論は、私が(個人的に)維持したくないコードをもたらしましたが、これは悪い兆候であることがわかっています。

これまでの作業

現在、Peeweeのpwiz.pyスクリプトを使用して、ターゲットデータベース内の既存の各データベーステーブルのモデルを生成し、すべての主キーと外部キーを入力しました。関係は設定されており、いくつかの簡単なテストでは、適切に関連付けられていることが示されました。

コード:次のようなものを使用して、列ヘッダーを取得することができました。

    for i, column in enumerate(User._meta.get_field_names()):
        ws.cell(row=0,column=i).value = column

前述のように、これは順序付けられていません。また、このようにすると、私は次のようなことをしなければなりません。

    getattr(some_object, title)

それに応じてフィールドに動的にデータを入力します。

考えと考えられる解決策

  • 配列に必要な順序を手動で書き出し、それを使用してデータをループし、データを入力します。これの長所は非常に厳格な/きめ細かい制御です。短所は、すべてのデータベースにこれを指定する必要があるということです。

  • (手動またはメソッドを介して)検出される可能性のあるすべてのフィールドに関連付けられた重み付き値を持つフィールドのハッシュを作成し、重みに従って「_meta.get_field_names()」を並べ替えるメソッドを記述します。これの短所は、あるDBではDOBの前に、別のDBではDOBの後に名前が表示されるなど、列が100%正しい順序になっていない可能性があることです。

私はそれをすべて間違っていると言ったり、これを行うためのまったく異なる方法を提案したりしてください、私はすべての耳です。私はPythonとPeewee(実際にはORM全般)に非常に慣れていません。私はPerlに戻って、DBIを介してデータベースクエリをほとんどまたはまったく面倒なく行うことができました。しかし、Excel用のライブラリは私に多くの問題を引き起こすので、これを私の知識を広げるための時間としてとらえたいと思います。

4

1 に答える 1

7

モデルメタには、使用できるメソッドがあります。

for field in User._meta.get_sorted_fields():
    print field.name

これにより、モデルで宣言されている順序でフィールド名が出力されます。

于 2012-12-14T19:26:30.747 に答える