2

mysql データベースに約 500k のエントリを持つ django モデルがあります。モデルに別のフィールドを追加したい:

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

幸いなことに、データベースのバックアップがあります。既存のデータを失うことなくモデルにフィールドを追加する方法はありますか?

4

1 に答える 1

0

500k レコードの場合、これはあなたの状況では不可能かもしれませんが、このページに来る可能性のある他の人のために、django-evolution https://code.google.com/p/django-を試してみることをお勧めします。南の代わりに進化/ 。私は両方を使用しましたが、フル機能ではありませんが、Evolution は South よりもはるかに手間をかけずにほとんどの移行を処理できることがわかりました。

于 2013-05-21T21:42:35.830 に答える