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'

它可以工作,但插入到“默认”中的记录的主键与从“db01”中获取的主键不同。为了保持与其他表的完整性,pk 不得更改。django 文档部分选择-a-database-for-save建议由于实例“a”已经有一个主键,因此当将新记录插入“默认”时将使用相同的主键。我不能让它这样做。

有谁知道这是否可以做到?提前致谢!!

(这可能看起来像一个奇怪的设置,但应用程序白天在断开连接的上网本上独立运行,并且在所有上网本都停靠的夜间数据合并到主数据库中。我可以在 mysql 中做得很好,但想如果可能,请使用 django ORM。)

4

2 回答 2

1

I know this is from a while ago, but I had the same issue today - judging by the key you're using, your id field is of type UUIDField from django_extensions?

It's slightly buggy, as the pre_save signal will always ensure the key is replaced regardless of whether there's one already existing. Subclassing it and replacing the pre_save function fixes it.

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”:

第二个选项是使用 save() 的 force_insert 选项来确保 Django 执行 SQL INSERT:

p = Person(name='Fred') p.save(using='first') p.save(using='second', force_insert=True) 这将确保名为 Fred 的人在两者上具有相同的主键数据库。如果在您尝试保存到第二个数据库时该主键已在使用中,则会引发错误。

于 2011-05-24T21:04:28.707 回答