我有一个现有人口数据库,并希望到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数据库的支持,如果有差别。
不,不会。我做了一个实验用的PostgreSQL,MySQL的,和SQLite从整数转换为浮动顺利在任何情况下,我也把一些值作为零来匹配您的情况。
如果你有一个值3
,它只是将变更为3.0
。
好吧,既然你把null=True
在你的领域的配置中所有的空值将保持为空,没有异议。如果您删除null=True
您可能需要指定一个default
值。
以int列并将其转变成浮动(真正的)应该不会失败,如果你觉得这会是一个非常大的发现一个奇怪的,奇怪的,非常特殊的情况。
......你可以先看看到SQL迁移与sqlmigrate,当然,你可以备份你的数据库。
您可以使用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了解详情。