【问题标题】:Django 1.9 | makemigrations on production server fails姜戈 1.9 |生产服务器上的 makemigrations 失败
【发布时间】:2017-01-18 02:33:31
【问题描述】:

我正在开发一个 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.forms 导入 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")

【问题讨论】:

  • 迁移是否在django_migrations 数据库表中?如果是这样,您可能需要从那里删除它们。不知道为什么这是你的第一次迁移,除非你复制了数据库 dev -> production,但值得一看。
  • 我的数据库是空的,所以没有 django_migrations。
  • 请显示回溯。

标签: mysql django database django-models django-forms


【解决方案1】:

使用--fake-initial 防止Django 在您第一次尝试迁移时抱怨app.table 不存在。

https://docs.djangoproject.com/en/1.10/topics/migrations/#initial-migrations

【讨论】:

  • 相同的结果 (; _ ;) 我认为我正在跟踪错误的根源(参见编辑 #2)
  • 如果您从forms.py 发布触发错误的代码会有所帮助。
  • 显然 Django 1.9 在迁移 models.py 文件之前 加载了 urls.py 文件,这在部署新环境时非常糟糕,因为正如我所见,每个人都有这个问题的问题。读到 django 是更好的 Web 开发框架后,这真是令人反感。
【解决方案2】:

我找不到任何“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 尝试检查数据库时,您会收到此错误(我知道,这很疯狂)。

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2011-08-28
    • 2022-08-17
    • 2016-02-07
    相关资源
    最近更新 更多