2011-05-24 15 views
0

djangoでは、あるデータベースの同じテーブルのデータを別のデータベースにコピーしたいとします。 'db01'から 'default'にコピーします。スキーマは同一です。django:新しいプライマリキーの作成を中止するにはどうすればいいですか?

>>> a=Household.objects.filter(h_identifier='H122000-48').using('db01') 
>>> a[0].pk 
>>> u'451465ea-0137-11e0-879a-70f1a16e0f80' 
>>> a[0].save(using='default') 
>>> b=Household.objects.filter(h_identifier='H122000-48').using('default') 
>>> b[0].pk 
>>> u'7c2484fe-8641-11e0-b080-00188b4d6b0e' 

'default'に挿入されたレコードの主キーは 'db01'からフェッチされたものと同じではありません。他のテーブルとの整合性を維持するために、pkを変更してはいけません。 djangoのdocsセクションselecting-a-database-for-saveは、インスタンス 'a'にすでにプライマリがあるので、新しいレコードが 'default'に挿入されたときに同じプライマリキーが使用されることを示しています。私はそれをすることができません。

これを行うことができますか?前もって感謝します!!

(これは奇妙な設定のように見えるかもしれませんが、アプリケーションは1日中に切断されたネットブックで独立して動作し、すべてのネットブックがドッキングされている夜にデータがマスターDBにマージされます。しかし、可能であればDjangoのORMを使用したい)

+0

これは、基礎となるデータベースの問題のようです。 –

+0

私はこれをmysqlで試しただけなので、あなたの答えを確認することはできませんが、それが最も可能性の高い理由です。 – erikvw

+0

RDBMSにはどのような問題がありますか? –

答えて

1

私は、これはしばらく前から知っているが、私は今日と同じ問題があった - あなたが使用しているキーによって判断すると、あなたのidフィールドがdjango_extensionsからUUIDField型ですか?

pre_save信号は、すでに存在するかどうかにかかわらず、キーが常に置換されることを保証するため、少しバグがあります。それをサブクラス化してpre_save関数を置き換えることで修正されます。

class FixedUUIDField(UUIDField): 
def pre_save(self, model_instance, add): 
    value = super(UUIDField, self).pre_save(model_instance, add) 
    if self.auto and add and not value: 
     value = unicode(self.create_uuid()) 
     setattr(model_instance, self.attname, value) 
    return value 
+0

それはしばらくして、私は別のアプローチに従った。私はこれをテストしていませんが、あなたがここにいるものは理にかなっていますので、私はあなたに投票します。ありがとう!! – erikvw

0

django docsは「force_insert」を使用することをお勧め:。

第二の選択肢は、(保存する force_insertオプションを使用することです) にDjangoがないことを確認してくださいSQL INSERT:

これは、その を保証します

P =人(名前= 'フレッド・') p.save(= '第2'、force_insert =真を使用して) p.save(= '最初' を使用) Fredという名前の人物には、 データベースに同じプライマリキーが あります。 を2番目のデータベースに保存しようとしたときに、そのプライマリキーがすでに である場合、エラー が発生します。

+0

"これにより、Fredという名前の人が両方のデータベースで同じプライマリキーを持つようになります。データベースがPKを変更しない場合にのみtrueを保持します。 –

+0

はい、これはドキュメントのことですが、私のサンプルを実行してもforce_insert = Trueであっても動作しません。 @ignacioはおそらくこれがdjango ORM/mysqlの問題であるという点で正しいです。 – erikvw

関連する問題