迁移PositiveIntegerField到FloatField

问题描述 投票:1回答:2

我有一个现有人口数据库,并希望到PositiveIntegerField转换成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数据库的支持,如果有差别。

django database postgresql django-models django-migrations
2个回答
3
投票

这会不会需要数据库列的全部重写?

不,不会。我做了一个实验用的PostgreSQL,MySQL的,和SQLite从整数转换为浮动顺利在任何情况下,我也把一些值作为零来匹配您的情况。

如果你有一个值3,它只是将变更为3.0

它可能会如何扩大,如果绝大多数值分别为空?

好吧,既然你把null=True在你的领域的配置中所有的空值将保持为空,没有异议。如果您删除null=True您可能需要指定一个default值。

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

以int列并将其转变成浮动(真正的)应该不会失败,如果你觉得这会是一个非常大的发现一个奇怪的,奇怪的,非常特殊的情况。

如果您有关于迁移结果有疑问...

......你可以先看看到SQL迁移与sqlmigrate,当然,你可以备份你的数据库。


1
投票

您可以使用sqlmigrate检查产生SQL进行迁移。

$蟒蛇manage.py sqlmigrate app_label migration_name

请记住,它的输出取决于Django的版本和你的设置有数据库。对于设置我手头上(Django的1.11,Postgres的9.3)为迁移我:

BEGIN;
--
-- Alter field field_to_convert on mymodel
--
ALTER TABLE "myapp_mymodel" DROP CONSTRAINT "myapp_mymodel_field_to_convert_check";
ALTER TABLE "myapp_mymodel" ALTER COLUMN "field_to_convert" TYPE double precision USING "field_to_convert"::double precision;
COMMIT;

其在性能和可靠性方面对我来说很好两者。我会说与AlterField继续。

如果你想成为额外的安全,你可以随时去:重命名场 - >创建场 - >运行python - >降场。这将使你在迁移过程中更多的控制。检查this answer了解详情。

© www.soinside.com 2019 - 2024. All rights reserved.