我们正在从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实例并恢复到原来的状态,但是我更担心会引入更多的细微问题,直到更晚的时候才能发现
答案 0 :(得分:6)
问了这个问题后,我遇到了Django ticket,Django开发人员的建议是编辑包含(Python 3)字节文字的任何旧版迁移文件(例如0001_initial),删除{{1 }},并在Python 3中将其设为字符串文字。
编辑迁移以解决此问题很安全。
您大概应该可以从那里删除用b
创建的迁移模块,并重做该命令,该命令不再对该参数的类型造成问题。
我使用以下方法对python3 ./manage.py makemigrations
的所有实例与'db_column=b'
进行批量查找和替换。当然,您应该在提交之前绝对检查'db_column='
。
git diff