【问题标题】:Change column type with django migrations使用 django 迁移更改列类型
【发布时间】:2015-02-07 17:01:50
【问题描述】:

考虑这个结构:

some_table(id: small int)

我想把它改成这样:

some_table(id: string)

现在我通过三个迁移来做到这一点:

  1. 创建一个字符串类型的新列_id
  2. (数据迁移)通过字符串转换将数据从id复制到_id
  3. 删除id并将_id重命名为id

有没有办法只用一次迁移来做到这一点?

【问题讨论】:

    标签: django django-migrations


    【解决方案1】:

    您可以直接将列的类型从 int 更改为 string。请注意,除非启用了严格的 sql 模式,否则整数将被截断到最大字符串长度并且数据可能会丢失,因此请始终进行备份并选择足够高的 max_length。此外,迁移不能轻易逆转(sql 不直接支持将字符串列更改为 int 列),因此备份在这一点中非常重要。

    Django pre 1.7 / South

    您可以使用db.alter_column。首先,创建一个迁移,但不要应用它,否则您会丢失数据:

    >>> python manage.py schemamigration my_app --auto
    

    然后,把forwards方法改成这样:

    class Migration(SchemaMigration):
        def forwards(self, orm):
            db.alter_column('some_table', 'id', models.CharField(max_length=255))
    
        def backwards(self, orm):
            raise RuntimeError('Cannot reverse this migration.')
    

    这将更改列以匹配新的CharField 字段。现在应用迁移,你就完成了。

    Django 1.7 您可以使用AlterField 操作来更改列。首先,创建一个空迁移:

    >>> python manage.py makemigrations --empty my_app
    

    然后,添加如下操作:

    class Migration(migrations.Migration):
        operations = [
            migrations.AlterField('some_model', 'id', models.CharField(max_length=255))
        ]
    

    现在运行迁移,Django 将更改字段以匹配新的CharField

    【讨论】:

    • 如果我想在 Django 1.11 中将列类型从 CharField 更改为 IntegerField,它的工作方式是否相同?
    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2017-07-28
    • 2021-12-04
    • 2016-02-29
    • 2014-06-30
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多