Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:如何将部分数据从一个实例移动到另一个实例_Django_Migrate - Fatal编程技术网

Django:如何将部分数据从一个实例移动到另一个实例

Django:如何将部分数据从一个实例移动到另一个实例,django,migrate,Django,Migrate,我们有两个相同的Django实例,一个是试用版,另一个是生产版。最近,一位试用客户购买了完整的产品,我只需要将他们的数据从试用转移到生产。我不知道是否有方便的方法,因为: 如果我使用Django fixture,那么它可能会覆盖生产系统中的现有数据,因为Django分配给每个条目的默认id(我可能错了,但我认为fixture只适用于初始化) 使用sql转储数据库可能也没有帮助,因为第一种方法存在类似的问题,而且它也很复杂,因为还有其他客户正在试用,但我只需要移动此客户机的数据 如果你有类似的经验

我们有两个相同的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(可能这部分的工作比较繁重)