[英]Django 1.9 | makemigrations on production server fails
我正在开发一个Intranet Web应用程序,在我的开发环境中一切正常,但是当我尝试在服务器上部署项目并使用makemigrations启动数据库迁移时,出现了“ app.table不存在”的错误。
我面临的问题是,确实,该表不存在,因为它是第一次迁移,并且该错误显示在我的forms.py文件中。
我试过了:
- Deleting the app/migrations folder, didnt helped
- Executing "python manage.py migrate --fake", same result
而且我确实已经创建了数据库
编辑错误触发于
/path/to/my/project/app/forms.py, in class Meta:
编辑#2
跟踪错误日志,似乎与project / project / urls.py有关。 我从app.form导入LoginForm和PasswordChange。 我认为这会在进行初始迁移之前触发对数据库的查询。
追溯
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
utility.execute()
File "/usr/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute
self.check()
File "/usr/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check
include_deployment_checks=include_deployment_checks,
File "/usr/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks
new_errors = check(app_configs=app_configs)
File "/usr/lib/python2.7/site-packages/django/core/checks/urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "/usr/lib/python2.7/site-packages/django/core/checks/urls.py", line 23, in check_resolver
for pattern in resolver.url_patterns:
File "/usr/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/usr/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/usr/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/rortega/smce/smce/urls.py", line 20, in <module>
from employeesControll.forms import LoginForm, PasswordChange
File "/home/rortega/smce/employeesControll/forms.py", line 60, in <module>
class employeesForm(forms.ModelForm):
File "/home/rortega/smce/employeesControll/forms.py", line 61, in employeesForm
class Meta:
File "/home/rortega/smce/employeesControll/forms.py", line 96, in Meta
'id_costCenter': forms.Select(choices=ccOptions, attrs={'class': 'form-control', 'name': 'id_costCenter'}),
File "/usr/lib/python2.7/site-packages/django/forms/widgets.py", line 514, in __init__
self.choices = list(choices)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__
self._fetch_all()
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 128, in __iter__
for row in compiler.results_iter():
File "/usr/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 802, in results_iter
results = self.execute_sql(MULTI)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 848, in execute_sql
cursor.execute(sql, params)
File "/usr/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "/usr/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/usr/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/usr/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 112, in execute
return self.cursor.execute(query, args)
File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 226, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorvalue
django.db.utils.ProgrammingError: (1146, "Table 'smce_db.employeesControll_costcenter' doesn't exist")
我找不到任何“ pythonic”解决方案,但是我可以通过在views.py文件中注释我对forms.py的任何引用来解决迁移问题,如下所示:
class JobcodeCreate(CreateView):
# form_class = jobcodeForm
model = JobCode
template_name = 'employeesControll/jobcode_create_form.html'
success_url = reverse_lazy('jobcode-add')
并在导入这些表单时创建if语句:
import sys
if 'makemigrations' not in sys.argv and 'migrate' not in sys.argv:
from .forms import (
jobcodeForm,
costcenterForm,
employeesForm,
employeesPersonalForm as form_EP,
emergencyContactForm as form_EC
)
我不知道这是唯一的还是最好的解决方案,但是只要它能正常工作,我就可以用它保持编码。
显然,这是1.9版本更新中的问题,因为自该版本以来,django会在进行迁移之前先加载urls.py,因此,如果加载了urls.py,还加载了views.py,并且如果您使用form_class自定义表单,forms.py尝试检查数据库时会出现此错误(我知道这很疯狂)。
使用--fake-initial
可以防止Django在您首次尝试迁移时抱怨app.table
不存在。
https://docs.djangoproject.com/en/1.10/topics/migrations/#initial-migrations
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.