Django:如何将部分数据从一个实例移动到另一个实例
我们有两个相同的Django实例,一个是试用版,另一个是生产版。最近,一位试用客户购买了完整的产品,我只需要将他们的数据从试用转移到生产。我不知道是否有方便的方法,因为:Django:如何将部分数据从一个实例移动到另一个实例,django,migrate,Django,Migrate,我们有两个相同的Django实例,一个是试用版,另一个是生产版。最近,一位试用客户购买了完整的产品,我只需要将他们的数据从试用转移到生产。我不知道是否有方便的方法,因为: 如果我使用Django fixture,那么它可能会覆盖生产系统中的现有数据,因为Django分配给每个条目的默认id(我可能错了,但我认为fixture只适用于初始化) 使用sql转储数据库可能也没有帮助,因为第一种方法存在类似的问题,而且它也很复杂,因为还有其他客户正在试用,但我只需要移动此客户机的数据 如果你有类似的经验
如果你有类似的经验,请给我一些建议 问题是您无法将主键(ID)从试用版传输到生产数据库,不是吗?So 2解决方案:
1)杀死蚂蚁的坦克 您对试用数据库执行SQL导出,并将每个主键和外键增加一个数字(例如:10000)。该数字必须足够高,以避免在数据库中导入时违反单一性约束
2)智能解决方案 如果且仅当您的模型设计良好:对于每个模型,您都可以找到一组列,这些列可以作为ID的替换主键。如果您的属性为
unique=True
,或者模型为unique\u=(…)
,那么这很完美:您可以使用
在源代码的每个模型中,都添加了方法get\u by\u natural\u key
:
class Person(models.Model):
firstname = models.CharField...
last_name = models.CharField...
class Meta:
unique_together = ("first_name", "last_name")
def get_by_natural_key(self, first_name, last_name):
return self.get(first_name=first_name, last_name=last_name)
然后,您可以使用Django导出试用数据库,并将ID替换为自然密钥!然后使用相同的代码,使用loaddata命令导入这些数据文件。第一种方法可能会有所帮助,但不确定。你这里所说的实例是指一个简单的记录还是一个object@drabo2005:哦,对不起,我所说的实例是指包含django项目的web服务器,而不是编程级别的实例。我认为我的情况属于第一类,但我喜欢您提供的新知识,而第二种解决方案我不知道。谢谢实际上,第一个解决方案并不是那么难:如果您只有几十个关系,那么您可以轻松编写一个SQL修补程序来获取prod DB中的最大(id)foreach,然后再编写另一个SQL修补程序来更新试用DB中的id(可能这部分的工作比较繁重)