蟒2 - > 3的Django迁移导致场参数类型变化

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

> 2.1和Python 2.7 - - > 3.6,我们是从Django的1.8转换一个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.初始迁移,0001_initial.py到bytes,看起来像这样:

# 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


我知道,我们可以只克隆RDS实例,并恢复到如果migrate会造成直接的问题,但我更关注的是引入更微妙的问题,不会被抓到直到很久以后。

python django django-migrations
1个回答
6
投票

我碰到一个Django ticket来问这个问题,在这里从一个Django开发者的建议是编辑任何遗留迁移文件(如0001_initial)包含(Python 3中)字节的文字,去除b,使他们在Python 3串文字之后。

编辑迁移来解决这个问题,是安全的。

从那里,你应该大概能够删除与python3 ./manage.py makemigrations所做的迁移模块和重做命令,一律不再发行与参数的类型。

我用下面的做大规模查找和替换'db_column=b' 'db_column='的所有实例。当然,你绝对应该做的是提交前检查git diff

grep -nrl "db_column=b" apps | xargs sed -i "s/db_column=b/db_column=/g"
© www.soinside.com 2019 - 2024. All rights reserved.