在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'已经有一个主要内容,因此当将新记录插入'default'时,将使用相同的主键。我无法做到这一点。
有谁知道这是否可以做到?提前谢谢!!
(这可能看起来像一个奇怪的设置,但应用程序在白天在断开连接的上网本上独立运行,并且数据在所有上网本停靠的夜晚合并到主数据库中。我可以在mysql中做得很好但是如果可能的话,我想使用django ORM。)
答案 0 :(得分: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
答案 1 :(得分:0)
django docs建议使用'force_insert':
第二种选择是使用 force_insert选项将save()保存到 确保Django执行SQL INSERT:
p = Person(name ='Fred') p.save(使用= '第一') p.save(using ='second',force_insert = True)这将确保 那个名叫弗雷德的人会有 两者都是相同的主键 数据库。如果那个主键是 您尝试保存时已经在使用 到第二个数据库,一个错误 将被提出。