7

注:有用な詳細については、[背景]セクションまで下にスクロールします。次の図では、プロジェクトが Python-Django と South を使用しているとします。

次の CSV をインポートする最良の方法は何ですか?

"john","doe","savings","personal"
"john","doe","savings","business"
"john","doe","checking","personal"
"john","doe","checking","business"
"jemma","donut","checking","personal"

関連するテーブルPersonAccount、およびAccountTypeを含む PostgreSQL データベースに、以下を考慮します。

  1. 管理者ユーザーは、カスタム UI を介してリアルタイムでデータベース モデルと CSV インポート表現を変更できます
  2. 保存された CSV からデータベースへのテーブル/フィールドのマッピングは、通常のユーザーが CSV ファイルをインポートするときに使用されます

これまで2つのアプローチが検討されてきました

  1. ETL-API アプローチ: ETL API にスプレッドシート、CSV からデータベースへのテーブル/フィールドのマッピング、およびターゲット データベースへの接続情報を提供します。その後、API はスプレッドシートをロードし、ターゲット データベース テーブルに入力します。pygrametl を見ると、私が目指していることが可能だとは思えません。実際、これを行う ETL API があるかどうかはわかりません。
  2. 行レベル挿入アプローチ: CSV からデータベースへのテーブル/フィールド マッピングの解析、スプレッドシートの解析、および「結合順序」での SQL 挿入の生成。

2 番目のアプローチを実装しましたが、アルゴリズムの欠陥とコードの複雑さに苦労しています。私が望むことを行うPython ETL APIはありますか? それとも、車輪の再発明を伴わないアプローチですか?


バックグラウンド

私が働いている会社は、SharePoint でホストされている何百ものプロジェクト固有の設計スプレッドシートをデータベースに移行しようとしています。管理者が各プロジェクトのデータベースを定義/モデル化し、そこにスプレッドシートを保存し、ブラウズ エクスペリエンスを定義できるようにすることで、ニーズを満たす Web アプリケーションの完成に近づいています。完成のこの段階では、商用ツールへの移行はオプションではありません。Web アプリケーションは、DB モデリング UI、CSV インポート/エクスポート機能、カスタマイズ可能なブラウズ、およびプロジェクト固有のカスタマイズに対応するためのモジュール化されたコードを備えた、django-admin の代替手段と考えてください。

実装された CSV インポート インターフェイスは面倒でバグが多いため、フィードバックを得て別の方法を見つけようとしています。

4

4 に答える 4

2

問題を2つの別々の問題に分けてはどうですか?

Personデータベース内の人を表すクラスを作成します。これは、DjangoのORMを使用するか、拡張するか、または自分で行うことができます。

今、あなたは2つの問題を抱えています:

  1. PersonCSVの行からインスタンスを作成します。
  2. Personインスタンスをデータベースに保存します。

これで、CSV-to-Databaseだけでなく、CSV-to-PersonとPerson-to-Databaseができました。これは概念的にはよりクリーンだと思います。管理者がスキーマを変更すると、Person-to-Database側が変更されます。管理者がCSV形式を変更すると、CSVからデータベース側に変更されます。これで、それぞれを個別に処理できます。

それは何か役に立ちますか?

于 2013-03-20T16:17:06.227 に答える
0

更新可能な SQL ビューを使用して、オッカムのかみそりごとにこの問題に対処するために、いくつかの手順を遡ることになりました。それはいくつかの犠牲を意味しました:

  1. 削除: South.DB 依存のリアルタイム スキーマ管理 API、動的モデルの読み込み、および動的 ORM 同期
  2. models.py と最初の南部への移行を手動で定義します。

これにより、フラットなデータセット (CSV/Excel) を正規化されたデータベースにインポートする簡単な方法が可能になります。

  1. スプレッドシートごとに models.py でアンマネージド モデルを定義する
  2. スプレッドシートのフィールド レイアウトに準拠する最初の南への移行で、それらを更新可能な SQL ビュー (INSERT/UPDATE-INSTEAD SQL RULE) にマップします。
  3. CSV/Excel スプレッドシートの行を反復処理し、INSERT INTO <VIEW> (<COLUMNS>) VALUES (<CSV-ROW-FIELDS>);
于 2013-03-26T04:58:12.487 に答える
0

私は職場でほぼ毎月、インポート サブシステムを作成しています。そのようなタスクを、以前に書いた django-data-importer の多くに適用しています。このインポーターは django フォームのように機能し、辞書のリストを提供する CSV、XLS、および XLSX ファイルのリーダーを備えています。

data_importer リーダーを使用すると、ファイルを dict のリストに読み込んで、for で反復処理し、行を DB に保存できます。インポーターでも同じことができますが、行の各フィールドを検証し、エラーとアクションをログに記録し、最後に保存するというボーナスがあります。

https://github.com/chronossc/django-data-importerをご覧ください。それがあなたの問題を解決し、これからあらゆる種類のcsvファイルの処理に役立つと確信しています:)

あなたの問題を解決するには、セロリタスクで data-importer を使用することをお勧めします。ファイルをアップロードし、シンプルなインターフェイスを介してインポート タスクを起動します。Celery タスクはファイルをインポーターに送信し、行を検証して保存し、エラーをログに記録できます。少し努力すれば、シートをアップロードしたユーザーにタスクの進行状況を表示することもできます。

于 2013-03-20T17:53:02.403 に答える