【问题标题】:duplicate table (identical) including primary key - using django south包含主键的重复表(相同) - 使用 django south
【发布时间】:2013-08-11 21:17:36
【问题描述】:

我正在使用南数据迁移将数据从一个表移动到另一个表(在 django 应用程序之间)

它按预期移动所有数据,但问题是它没有复制主键 (ID),而是创建一个新的(在新表中)有意义..

但是我怎样才能使一个新表相同,包括 id 字段(这是默认的,未在模型中定义)

使用mysql

【问题讨论】:

    标签: python django django-south database-migration


    【解决方案1】:

    有两种基本方法可以做你想做的事:

    1. 编写多步骤迁移。
    2. 遍历行并设置 ID。

    我认为第二个更容易,虽然我不确定你想要做什么。如果你已经在写类似的东西了

    for a in A.objects.all():
        b = B(attr1 = a.attr1, ...)
        b.save()
    

    那你就不能简单写

    b = B(id = a.id, attr1 = a.attr1, ...)
    

    如果您使用更自动的方式复制行,请考虑多步骤迁移方法: 1. 将模型 A 和 B 写成这样:

      class A(model):
          real_data = CharField()
      class B(model):
          real_data = CharField()
          fake_id = IntegerField(primary_key=True)
          id = IntegerField()
    
    1. 编写将 A 复制到 B 的数据迁移
    2. 编写架构迁移,使 B.id 成为 primary_key 并删除 fake_id

    【讨论】:

    • hmm "b = B(id = a.id, attr1 = a.attr1, ...)" 应该可以,我没试过!根据@alecxe 的回答,我最终使用 LIKE。
    【解决方案2】:

    forwards 部分中使用LIKE 创建表,将旧表中的所有内容插入到新表中。在backwards 部分只需删除新表即可。

    def forwards(self, orm):
        db.execute("CREATE TABLE new_table LIKE old_table")
        db.execute("INSERT new_table SELECT * old_table")
    
    def backwards(self, orm):
        db.drop_table('new_table')
    

    希望对您有所帮助。

    【讨论】:

    • 嗯,当我们使用“LIKE”时,它会在 ManyToManyField 的情况下处理 ForeignKey 和单独的表吗?
    • 恐怕它不会为多对多创建单独的表。外键按原样复制。
    猜你喜欢
    • 2011-10-15
    • 2014-09-11
    • 2014-08-30
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2017-02-09
    • 2011-07-16
    相关资源
    最近更新 更多