如何将现有 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 makemigrations
和
python 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SSMA(用于访问 SQL Server)将具有不同列的表迁移到现有表中?