将 PositiveIntegerField 迁移到 FloatField

Mat*_*att 4 database django postgresql django-models django-migrations

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

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

该字段当前定义为:

field_to_convert = models.PositiveIntegerField(
    null=True,
    blank=True,
    help_text='my helpful text')
Run Code Online (Sandbox Code Playgroud)

这是否需要完全重写数据库列?对于更大的数据库来说,这种转换的扩展效果如何?如果绝大多数值都是 的话,它会如何扩展null?什么情况下这种转换会失败?如果有区别的话,这是由 Postgres 数据库支持的。

Ray*_*nda 8

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

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

如果你有一个值3,它就会变成3.0

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

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

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

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

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

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