Fresh mysql database getting "mydb.background_task doesn't exist" - Django

Viewed 653

I have a fresh install of a django app that uses background_tasks. If I remove the models that use background_task then I am able to do

python manage.py makemigrations

However, if I keep them, I get a table missing exception:

"mydb.background_task doesn't exist"

I have seen other people with this issue but I have tried every single suggestion: - delete all migrations files - delete sqlite3 dump file - uninstall django and django-background-tasks - make sure my machine does not have those two packages installed even outside of the virtualenv - I tried deleting my virtualenv and reinstalling everything.

I have tried all of these things and python manage.py makemigrations is still giving me that exception. But nothing else does that.

Django==2.1.5
django-background-tasks==1.2.0
django-compat==1.0.15
django-mysql==3.2.0

p.s: I am using Cloud SQL, I don't know if that affects anything, I don't think so. same issue with mysql

EDIT: adding the trace

Traceback (most recent call last):
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/cursors.py", line 198, in execute
    res = self._query(query)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/cursors.py", line 304, in _query
    db.query(q)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/connections.py", line 217, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.ProgrammingError: (1146, "Table 'zynqdb_dev.background_task' doesn't exist")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/base.py", line 350, in execute
    self.check()
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/management/base.py", line 366, in _run_checks
    return checks.run_checks(**kwargs)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/checks/registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/checks/urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/core/checks/urls.py", line 23, in check_resolver
    return check_method()
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 396, in check
    for pattern in self.url_patterns:
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/utils/functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 533, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/utils/functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/urls/resolvers.py", line 526, in urlconf_module
    return import_module(self.urlconf_name)
  File "/Users/cottrell/tessel/venv/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/cottrell/tessel/tesselapp/tesselapp/urls.py", line 49, in <module>
    one_time_setup_background(priority=10)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/background_task/tasks.py", line 296, in __call__
    remove_existing_tasks)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/background_task/tasks.py", line 239, in schedule
    task.save()
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/background_task/models.py", line 315, in save
    return super(Task, self).save(*arg, **kw)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/base.py", line 718, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/base.py", line 748, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/base.py", line 831, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/base.py", line 869, in _do_insert
    using=using, raw=raw)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/query.py", line 1136, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1289, in execute_sql
    cursor.execute(sql, params)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 71, in execute
    return self.cursor.execute(query, args)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/cursors.py", line 198, in execute
    res = self._query(query)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/cursors.py", line 304, in _query
    db.query(q)
  File "/Users/cottrell/tessel/venv/lib/python3.7/site-packages/MySQLdb/connections.py", line 217, in query
    _mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1146, "Table 'zynqdb_dev.background_task' doesn't exist")

Also I have already tried:

find . -path "*/migrations/*.pyc"  -delete
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete

I have tried reinstalling and uninstalling.

Also, the same error occurs if I do python manage.py showmigrations.

Here's the part of the model where if I comment out @background it works, but with @background it doesn't work.

def one_time_setup():
    if settings.SENTRY_TOKEN:
        sentry_sdk.init(
            settings.SENTRY_TOKEN,
            integrations=[DjangoIntegration()]
        )


#@background()
def one_time_setup_background():
    one_time_setup()


# Do one-time setup in django app, and background with high priority.
one_time_setup()
one_time_setup_background()
3 Answers

Try doing the following from the Documentation:

Install from PyPI:

pip install django-background-tasks

Add to INSTALLED_APPS inside your settings.py.

INSTALLED_APPS = (
# ...
'background_task',
# ...
)

Check that everything is fine with your migrations.

python manage.py showmigrations

Migrate your database and check if the background_task file is added to the migrations list.

python manage.py migrate

Make modifications in your views in which ever way you want to use the background_tasks. For example, you can look up a userID and send them message.

from background_task import background
from django.contrib.auth.models import User

@background(schedule=60)
def notify_user(user_id):
    # lookup user by id and send them a message
    user = User.objects.get(pk=user_id)
    user.email_user('Here is a notification', 'You have been notified')

It sounds like you didn't delete the contents of each pycache folder, which means Django will still try to reference non-existent migrations.

Here is an easy-to-use shortcut for clearing migrations, which I found from this blog post. Just run the following from the CLI in your root project folder:

find . -path "*/migrations/*.py" -not -name "__init__.py" -not -path "./env/*" -delete
find . -path "*/migrations/*.pyc" -not -path "./env/*" -delete

Afterwards, delete your sqlite db, and try the migrations again.

If you run this in the wrong directory, you will break your Django download, along with any 3rd party Django apps that use migrations!

I use this frequently, so I went ahead and made it a bash function:

function djclear() {
  dir="${PWD##*/}"
  if [ -d $dir ]; then
       find . -path "*/migrations/*.py" -not -name "__init__.py" -not -path "./env/*" -delete
       find . -path "*/migrations/*.pyc" -not -path "./env/*" -delete
  else
    echo "Returning with exit code 1. Are you sure that you are in a project directory?"
    return 1
  fi
}

This looks complicated, but all it really does is confirm that you are in a Django Project folder before executing the command.

Related