Python 2-> 3 Django迁移导致字段参数类型更改

时间:2018-08-28 12:11:32

标签: python django django-migrations

我们正在从Django 1.8-> 2.1和Python 2.7-> 3.6过渡Django项目。

在旧的项目版本中,有些Django模型如下所示:

# models.py

from django.db import models

class RowStatusModel(models.Model):
    active = models.BooleanField(default=True, db_column='is_active')
    # ...
    class Meta:
        abstract = True

请注意,此模块中未使用from __future__ import unicode_literals。这意味着db_column是Python 2 str,对应于Python 3中的bytes。初始迁移0001_initial.py如下所示:

# 0001_initial.py

operations = [
    # ...
    ('row_ef', models.BooleanField(default=True, db_column=b'is_active')
    # ...
]

请注意,我认为字节字面量b'is_active是由Django完成的,目的是使其更加明确,但不确定。

现在,在将大多数代码库由2to3转换并运行makemigrations之后,Python 3将字符串文字视为Python 2中的unicode类型,因此生成了db_column为字符串文字,适用于继承自RowStatusModel的每个模型:

# migrations/0023_auto_20180827_1955.py 
migrations.AlterField(
    # ...
    field=models.BooleanField(default=True, db_column='is_active')
), # ...

运行./manage.py migrate会对数据库产生什么影响(如果有的话)? “更改”是纯粹在Python方面,还是可能产生什么副作用?


数据库引擎为django.db.backends.postgresql


我知道,如果migrate引起直接问题,我们可以克隆RDS实例并恢复到原来的状态,但是我更担心会引入更多的细微问题,直到更晚的时候才能发现

1 个答案:

答案 0 :(得分:6)

问了这个问题后,我遇到了Django ticket,Django开发人员的建议是编辑包含(Python 3)字节文字的任何旧版迁移文件(例如0001_initial),删除{{1 }},并在Python 3中将其设为字符串文字。

  

编辑迁移以解决此问题很安全。

您大概应该可以从那里删除用b创建的迁移模块,并重做该命令,该命令不再对该参数的类型造成问题。

我使用以下方法对python3 ./manage.py makemigrations的所有实例与'db_column=b'进行批量查找和替换。当然,您应该在提交之前绝对检查'db_column='

git diff