代码之家  ›  专栏  ›  技术社区  ›  Brad Solomon

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

  •  9
  • Brad Solomon  · 技术社区  · 8 年前

    我们正在从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 ,对应于 bytes 在Python 3中。初始迁移,0001_initial.py,如下所示:

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

    注意字节文字 b'is_active 我想这是姜戈为了更明确的目的而做的,但我不确定。

    现在,在用2to3转换大多数代码库并运行之后 makemigrations ,python 3将字符串文本视为python 2中的unicode类型,从而生成一个迁移,其中 dB列 是字符串文本,对于继承自 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 会导致立即出现问题,但我更担心的是,会有更微妙的问题被引入,直到很晚才会被发现。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Brad Solomon    7 年前

    Django ticket b

    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"