Rafael Ortega
Rafael Ortega

Reputation: 454

Django 1.9 | makemigrations on production server fails

Im developing an intranet web app, everything is working fine in my development enviroment, but when i try to deploy the project on my server and start the database migration with makemigrations i get the error that "app.table doesnt exist".

The problem im facing is that indeed, the table doesnt exist because its the first migration im making, and the error is presented in my forms.py file.

I tried:

- Deleting the app/migrations folder, didnt helped
- Executing "python manage.py migrate --fake", same result

And i do have created the database

Edit The error is triggered in

/path/to/my/project/app/forms.py, in class Meta:

Edit #2

Tracking the log of the error, it seems to be something with project/project/urls.py. Im importing from app.forms the LoginForm and PasswordChange. i think this is triggering some query to the database before making the initial migrations.

Traceback

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")

Upvotes: 0

Views: 483

Answers (2)

Rafael Ortega
Rafael Ortega

Reputation: 454

I couldn’t find any "pythonic" solution, but I could solve the migration problem by commenting in my views.py file any reference I had to forms.py like this:

class JobcodeCreate(CreateView):
    # form_class = jobcodeForm
    model = JobCode
    template_name = 'employeesControll/jobcode_create_form.html'
    success_url = reverse_lazy('jobcode-add')

and also creating an if statement when I import those forms:

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
    )

I don’t know if this is the only or the best solution, but as long as it worked and i can keep coding im cool with it.

Apparently this is an issue from 1.9 version update because, since this version, django loads the urls.py before making the migrations, so if urls.py is loaded, also views.py, and if you use form_class to customize the class of the form, you'll get this error when forms.py tries to check the database (crazy, I know).

Upvotes: 2

souldeux
souldeux

Reputation: 3755

Use --fake-initial to prevent Django from complaining about app.table not existing when you try to migrate for the first time.

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

Upvotes: 0

Related Questions