小编pin*_*ino的帖子

如果AddField引用"相同"列,则使用"--fake-initial"的Django迁移不起作用

我正在玩django(我是一个非常新的初学者),在浏览网页时,我读到可以将我们内部的camelCase命名约定保留在mySQL数据库中,也可以保存在models.py中的模型名称

好了,过了些日子,我可以断定这是更好地把事情,因为他们的设计,并使用所产生的标准输出inspectdb没有任何改变它的代码(我删除的.lower() 功能:-))

无论如何,出于好奇,如果有人能解释为什么接下来的工作无效,我将不胜感激.简而言之,在我看来,如果列名已经在数据库中,或者至少它以区分大小写的方式进行比较,那么负责迁移的代码没有正确检查(?).这是设计的吗?

我使用从互联网上本指南https://datascience.blog.wzb.eu/2017/03/21/using-django-with-an-existinglegacy-database/

mysql正在运行该选项" --lower-case-table-names=0",并且排序规则不区分大小写.

在里面,models.py我有这个

class City(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)
    name = models.CharField(db_column='Name', max_length=35)
    countrycode = models.ForeignKey(Country, db_column='CountryCode')
    district = models.CharField(db_column='District', max_length=20)
    population = models.IntegerField(db_column='Population', default=0)

    def __str__(self):
        return self.name

    class Meta:
        managed = True
        db_table = 'city'
        verbose_name_plural = 'Cities'
        ordering = ('name', )
Run Code Online (Sandbox Code Playgroud)

如果我将引用更改'db_column'db_column='countryCode' (注意较低的"c")并且我运行

./manage.py migrate --database world_data --fake-initial worlddata
Run Code Online (Sandbox Code Playgroud)

我收到错误'django.db.utils.OperationalError:(1050,"表'城市'已经存在")'

并且问题仅在使用--fake-initial 选项时出现

在分析了"... django/db/migrations/executor.py"之后,我找到了那些检查列是否已经在现有内部的行

column_names = [
    column.name for column …
Run Code Online (Sandbox Code Playgroud)

python django python-3.x django-migrations

6
推荐指数
1
解决办法
155
查看次数

标签 统计

django ×1

django-migrations ×1

python ×1

python-3.x ×1