首页 > 解决方案 > 将 PositiveIntegerField 迁移到 FloatField

问题描述

我有一个现有的填充数据库,想将 aPositiveIntegerField转换为FloatField. 我正在考虑简单地进行迁移:

    migrations.AlterField(
        model_name='mymodel',
        name='field_to_convert',
        field=models.FloatField(
            blank=True,
            help_text='my helpful text',
            null=True),
    ),

该字段当前定义为:

field_to_convert = models.PositiveIntegerField(
    null=True,
    blank=True,
    help_text='my helpful text')

这是否需要完全重写数据库列?这种转换对于大型数据库的规模有多大?如果绝大多数值是 ,它会如何扩展null?在什么情况下这种转换会失败?如果这有所作为,这是由 Postgres 数据库支持的。

标签: djangodatabasepostgresqldjango-modelsdjango-migrations

解决方案


这是否需要完全重写数据库列?

不,不会的。我对 PostgreSQL、MySQL 和 SQLite 做了一个实验,从整数到浮点数的转换在每种情况下都很顺利,我还将一些值设置为 null 以匹配您的情况。

如果您有一个值3,它只会更改为3.0.

如果绝大多数值为空,它会如何扩展?

好吧,由于您保留null=True字段的配置,所有空值都将保持为空,这没问题。如果您删除null=True,您可能需要指定一个default值。

在什么情况下这种转换会失败?

取一个 int 列并将其转换为 float(实数)应该不会失败,如果您发现一个奇怪、怪异且非常特殊的情况,那将是一个非常大的发现。

如果您对迁移结果有疑问...

...您可以先使用sqlmigrate查看迁移 SQL ,当然,您可以备份数据库。


推荐阅读