> 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
会造成直接的问题,但我更关注的是引入更微妙的问题,不会被抓到直到很久以后。
我碰到一个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"