pin*_*ino 6 python django python-3.x django-migrations
我正在玩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 in
self.connection.introspection.get_table_description(self.co$
]
if field.column not in column_names:
return False, project_state
Run Code Online (Sandbox Code Playgroud)
在这里,根据我的理解,没有区分大小写的比较,因此在"countryCode"内部找不到列"column_names":
-> if field.column not in column_names:
(Pdb) field.column
'countryCode'
(Pdb) column_names
['ID', 'Name', 'CountryCode', 'District', 'Population']
Run Code Online (Sandbox Code Playgroud)
首先,我要祝贺您回答完第一个问题!许多年长的贡献者并没有像您那样深入。
首先让我们把事情搞清楚。您提到--lower-case-table-names=0已启用但排序规则不区分大小写。从文档中我看到该选项强制表名区分大小写。我可能只是读错了,但看起来你是说一切都应该不区分大小写。此外,排序规则通常指数据本身,而不是列名,以防您不知道。
据我所知,所有数据库都不区分大小写地对待列名(我刚刚在 SQLite 中进行了测试),因此您可能刚刚发现了 Django 中的一个错误!我查看了该文件的历史记录,在该代码存在的 5 多年里,我猜没有人遇到过这个问题。这是可以理解的,因为通常人们要么 a) 让 django 从头开始创建数据库,因此一切都是同步的,要么 b) 他们用来inspectdb生成具有正确大小写的列的代码。
看来您只是在玩玩,所以我认为您并不是在寻找特定的解决方案。也许下一步是提交错误;)?从我看来,在那里添加不区分大小写的比较不会有任何缺点,但从事 Django 24/7 工作的人可能有不同的看法。