【问题标题】:Lose data with django-south schemamigration使用 django-south schemamigration 丢失数据
【发布时间】:2013-05-14 14:06:02
【问题描述】:

我有一个 django 模型,在 mysql 数据库中有大约 500k 个条目。我想在我的模型中添加另一个字段:

site = models.ForeignKey(Site, verbose_name=_('Site'),null=True,blank=True).

但是我丢失了所有数据,通过运行:

python manage.py schemamigration product --auto
python manage.py migrate product

生成的迁移脚本是:

class Migration(SchemaMigration):
    def forwards(self, orm):
        # Adding field 'Product.site'
        db.add_column('product_product', 'site',
                      self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sites.Site'], null=True, blank=True),
                      keep_default=False)
    def backwards(self, orm):
        # Deleting field 'Product.site'
        db.delete_column('product_product', 'site_id')

迁移生成的sql为:

Running migrations for product:
 - Migrating forwards to 0016_auto__add_field_product_site.
 > product:0016_auto__add_field_product_site
   = SET FOREIGN_KEY_CHECKS=0; []
   = ALTER TABLE `product_product` ADD COLUMN `site_id` integer NULL; []
   - no dry run output for alter_column() due to dynamic DDL, sorry
   = ALTER TABLE `product_product` ADD CONSTRAINT `site_id_refs_id_10570b8a766fecf5` FOREIGN KEY (`site_id`) REFERENCES `django_site` (`id`); []
   = CREATE INDEX `product_product_6223029` ON `product_product` (`site_id`); []

'python manager.py migrate product--list' 的最新迁移历史是:

(*) 0011_auto__add_field_product_category_str
(*) 0012_auto__add_field_product_store_id
(*) 0013_auto__del_field_product_site__del_unique_product_sku_site__del_unique_
(*) 0014_auto__chg_field_product_short_description__chg_field_product_descripti
(*) 0015_auto__add_field_product_phase_tag
( ) 0016_auto__add_field_product_site

幸运的是,我有数据库备份。有没有办法在不丢失现有数据的情况下向模型添加字段?

【问题讨论】:

  • 您是否尝试过手动编写迁移,而不是使用--auto 选项?
  • 最好能显示生成迁移的内容和对应执行的SQL...
  • 向我们展示为产品应用生成的迁移,以及 ./manage.py migrate --list 的输出
  • @okm 脚本已添加,我没有看到负责删除数据的命令
  • 这应该可以正常工作而无需任何删除,除非您有一些可以执行此操作的 sql 触发器。另外,您确定在运行此迁移后数据实际上被删除了吗?你在数据库里查过吗?

标签: django django-models django-south


【解决方案1】:

对于 50 万条记录,这可能不适用于您的情况,但为了其他可能访问此页面的人的利益,您可能想尝试使用 django-evolution https://code.google.com/p/django-evolution/ 而不是 South。我两者都用过,发现虽然功能不够全面,但 Evolution 处理大多数迁移的过程比 South 少得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2013-07-27
    • 2013-05-09
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多