gpt4 book ai didi

django - 使用 django 迁移更改列类型

转载 作者:行者123 更新时间:2023-12-02 06:33:16 24 4
gpt4 key购买 nike

考虑这个结构:

some_table(id: small int)

我想把它改成这样:

some_table(id: string)

现在我通过三个迁移来完成此操作:

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

有没有办法只需要一次迁移就可以做到这一点?

最佳答案

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

Django 1.7 之前/南

您可以使用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 - 使用 django 迁移更改列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com