4

我们有 2 个相同的 Django 实例,一个用于试用,另一个用于生产。最近一位试用客户购买了完整的产品,我只需要将他们的数据从试用版转移到生产中。我不知道是否有一种方便的方法可以做到这一点,因为:

  1. 如果我使用 Django 固定装置,那么它可能会覆盖生产系统中的现有数据,因为 Django 分配给每个条目的默认 ID(我可能错了,但我认为固定装置只对初始化有用)。

  2. 由于与第一种方法类似的问题,使用 sql 转储数据库可能无济于事,而且它也很复杂,因为还有其他客户正在试用,但我只需要移动该客户的数据。

如果你有类似的经历,请给我一些建议。

4

1 回答 1

4

问题是您无法将主键 (ID) 从试用版传输到生产数据库,不是吗?所以2个解决方案:


1)坦克杀死蚂蚁

您对试用数据库执行 SQL 导出,并将每个主键和外键增加一个数字(例如:10000)。当您将其导入数据库时​​,此数字需要足够高以避免违反唯一性约束


2) 智能解决方案

当且仅当您的模型设计良好:对于每个模型,您都可以找到一组列,这些列可以作为 ID 的替代主键。如果您有带有 的属性unique = True,或者带有它的模型,unique_together = (...)那就完美了:您可以使用自然键

在源代码的每个模型中,添加方法get_by_natural_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 dumpdata 命令导出试用数据库,并将 ID 替换为自然键!然后使用相同的代码,使用loaddata 命令导入这些数据文件。

于 2013-09-06T14:50:46.360 回答