我们正在将一个 Django 项目从 Django 1.8 -> 2.1 和 Python 2.7 -> 3.6 进行迁移。
在旧版本的项目中,有像这样的 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类型,并因此为每个继承自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导致了立即的问题,但我更担心会引入一些微妙的问题,这些问题直到很久以后才会被发现。
b前缀。如果选择生成新的迁移,它将不会产生任何影响。 - solarissmoke