0

django では、あるデータベース内の同一のテーブルから別のデータベース内のテーブルにデータをコピーしたいと考えています。「db01」から「デフォルト」へ。スキーマは同一です。

>>> 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」にはすでにプライマリがあるため、新しいレコードが「デフォルト」に挿入されるときに同じプライマリキーが使用されることを示唆しています。私はそれをすることができません。

これができるかどうか誰にもわかりますか?前もって感謝します!!

(これは奇妙なセットアップのように思えるかもしれませんが、アプリケーションは日中は切断されたネットブックで独立して実行され、データはすべてのネットブックがドッキングされている夜間にマスター データベースにマージされます。mysql で問題なく実行できますが、可能であれば、django ORM を使用してください。)

4

2 に答える 2

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
于 2011-09-10T08:20:46.360 に答える
0

django ドキュメントでは、「force_insert」の使用が提案されています。

2 番目のオプションは、force_insert オプションを save() に使用して、Django が確実に SQL INSERT を実行するようにすることです。

p = Person(name='Fred') p.save(using='first') p.save(using='second', force_insert=True) これにより、Fred という名前の人が両方で同じ主キーを持つことが保証されます。データベース。2 番目のデータベースに保存しようとしたときにその主キーが既に使用されている場合、エラーが発生します。

于 2011-05-24T21:04:28.707 に答える