gpt4 book ai didi

Python 2 -> 3 Django迁移导致字段参数类型改变

转载 作者:太空狗 更新时间:2023-10-29 18:33:14 24 4
gpt4 key购买 nike

我们正在从 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 实例并恢复到该实例,但我更关心引入的更微妙的问题,直到很久以后。

最佳答案

我遇到了一个 Django ticket在问了这个问题之后,Django 开发人员的建议是编辑任何包含 (Python 3) 字节文字的遗留迁移文件(例如 0001_initial),删除 b 并将它们设为字符串文字Python 3。

Editing migrations to fix this issue is safe.

从那里您应该能够删除使用 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"

关于Python 2 -> 3 Django迁移导致字段参数类型改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com