如何将现有 CharField 与数据迁移到 Django 中的 IntegerField

Posted

技术标签:

【中文标题】如何将现有 CharField 与数据迁移到 Django 中的 IntegerField【英文标题】:How do I migrate existing CharField with data to IntegerField in Django 【发布时间】:2016-09-05 12:09:58 【问题描述】:

我的 models.py 中有一些带有 CharFields 的模型。

例如

class MyModel(models.Model):
    item_port = models.CharField(max_length=50)`

我意识到这对于一个端口来说有点愚蠢,并将它们全部更改为 IntegerFields,如下所示:

class MyModel(models.Model):
    item_port = models.IntegerField(null=True)

我在本地开发系统中使用 sqlite3 和 mysql 类型的数据库进行部署。通常,我在从头开始部署时为新的 docker 实例制造迁移:

python manage.py makemigrationspython manage.py migrate

但是,我在 git 中也记录了对我的 sqlite3 数据库进行的所有迁移,以供参考。

我的主要问题是,我是否可以简单地使用数据库中的现有数据从 CharField 迁移/迁移到 IntegerField(在客户端站点上将是 MySQL 类型的数据库,或者我需要手动执行类似的操作吗? ?:

https://docs.djangoproject.com/en/1.9/topics/migrations/#data-migrations

非常感谢。

【问题讨论】:

我相信当您从CharField 更改为IntegerField 时,'8080' 之类的字符串将转换为8080 之类的整数。但是,您可能对其他字符串有问题。特别是,您可能需要进行数据迁移以将空字符串 '' 转换为 None(在这种情况下,您需要再次迁移以将 CharField 更改为 null=True)。确保您测试 MySQL 和 sqlite - 不要假设它们的行为方式相同。 对于这种类型的迁移,当需要更改数据时,您必须进行上述数据迁移... 根据官方消息,您不能专门将文本字段更改为整数字段并假设 Django 迁移系统可以处理:docs.djangoproject.com/en/2.2/ref/migration-operations/… 【参考方案1】:

如果您注意到 item_port 应该是 IntergerField 而不是 CharField 您可以运行

./manage.py schemamigration myapp --auto --update

参考南方文档Advanced Commands and Data Migrations

希望这会有所帮助:)

【讨论】:

感谢您的建议。恐怕我不久前选择回到 Django 的迁移系统,因为 South 不能满足我的需求。

以上是关于如何将现有 CharField 与数据迁移到 Django 中的 IntegerField的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有 Azure 资产迁移到 Azure 应用服务

MongoDB 将所有现有索引迁移到新数据库

如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?

将现有数据库与 AdonisJS 一起使用

Azure DevOps 服务器 - 如何将现有集合/项目迁移到 SCRUM

迁移到现有数据库而不匹配迁移