2009-03-24 13 views
0

を使用してDjangoアプリケーションにデータを書き込む私のDjangoアプリケーションをデータで満たすPythonプログラムを出力するプログラムを作成しました。しかし、このプログラムは23 MBの大きさで、私のコンピュータはそれを実行しません。これには解決策がありますか?非常に大きなPythonスクリプト

データベースを埋めるもう1つの解決策は、フィクスチャを使用することです。問題は、まだ私は新しい主キーを知らないということです...または私は古いものを使用する必要があります(私は好きではない)。

提案がありますか?

私のパスの理由:私は新しいデータベースとはまったく異なるデータベースを移行しており、多くの関係もあります。 23 MBのプログラムは、ソースデータベースからすべてのオブジェクトを覚えています。そのため、簡単に半分にカットされません。おそらくこれを行うためのより良い方法がありますか?私は、Djangoを使用する方が生のSQLを使用する方が好きです。

+1

23Mbプログラムのスニペットを投稿できますか? –

+0

私は、コードが非常に非効率的であることを知りました。私は関数を使用してそれを小さくしようとしています! –

+0

データを読み込んでDjangoモデルオブジェクトを作成するための小さなプログラムを書くのではなく、データを大量のコードに変換した理由を説明できますか? –

答えて

1

ほとんどの場合、オブジェクトには自然な階層があります。場合によってはある種の「マスター」があり、他のすべてのオブジェクトには、このマスターと外部キーに対する外部キー(FK)の参照があります。

この場合、各マスターオブジェクトに多数の補助オブジェクトを「含む」XML形式の構造を使用できます。この場合、最初にマスターを挿入し、すべての子に既存のオブジェクトへのFK参照があります。

しかし、場合によっては、既存のオブジェクトに対して単純なFKではないリレーションシップがあります。この場合、循環依存があり、(1)この依存関係を一時的に中断し、(2)オブジェクトがロードされた後に依存関係を再作成する必要があります。

これは、(a)オプションのFKを持つようにモデルを定義し、(b)一時的な "ナチュラルキー"参照を持つことによって行います。適切なFKなしでデータをロードします(オプションです)。

次に、データがロードされた後、2番目のパスに戻り、見つからないFK参照をすべて挿入します。これが完了したら、モデルを修正してFKを必須にすることができます。

プログラム1 - 古いデータベースから単純なフラットファイルにエクスポートします。 CSV形式またはJSON形式または何か簡単です。

for m in OldModel.objects.all(): 
    aDict = { 'col1':m.col1, 'old_at_fk':m.fktoanothertable.id, 'old_id':id } 
    csvwriter.writerow(aDict) 

プログラム2 - 単純なフラットファイルを読み込みます。新しいデータベースモデルオブジェクトを構築する。

# Pass 1 - raw load 

for row in csv.reader: 
    new= NewModel.create(**row) 

# Pass 2 - resolve FK's 

for nm in NewModel.objects.all(): 
    ref1= OtherModel.objects.get(old_id=nm.old_at_fk) 
    nm.properfk = ref1 
    nm.save() 
+0

pickleを使って辞書を読み書きするのが最も簡単な方法です –

0

大きなプログラムがあるので、コンピュータはそれを実行しませんでしたか?

たぶん、あなたはすべての構造で、外部ファイル、またはファイルを参照して、データベース内でそれをダンプし、代わりにスクリプト/ソフトウェアの内部でそれを書くの...

0

が別々にデータを入れなければなりませんファイル(または複数のファイル)。次に、データを読み込んでDjangoを使用してデータベースにデータを読み込む小さなプログラムを作成します。

0

あなたの投稿を正しく読んでいるなら、古いデータベースを読み、そのデータに基づいて "pythonプログラム"を書いています。これは私にはこれを行うには間違った方法だと思われます。

DBからデータを読み込み、必要に応じて変更してファイルにダンプすることで、古いデータベースの柔軟性のあるバージョンを作成することを提案します(これはうまくいくでしょう)。

このデータの柔軟性のあるバージョンでは、別のプログラムを使用して、このデータをDjangoモデルを介して新しいデータベースにインポートします。

これにより、このプロセスを複製する必要がある場合でも、柔軟性が得られます。

関連する問題