我正在玩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)