Francisco Ghelfi
Francisco Ghelfi

Reputation: 962

Django makemigrations not finding tables

I have a Django APP that work perfectly fine.

I downloaded the repository from Github to a new laptop, but when I try to run:

I get django.db.utils.OperationalError: no such table: catalog_categorias_producto

Already tried:

No difference.

Any clues? Thanks!

Full error log

Traceback (most recent call last):
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: catalog_categorias_producto

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 "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\core\management\__init__.py", line 357, in execute
    django.setup()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\apps\registry.py", line 122, in populate
    app_config.ready()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\contrib\admin\apps.py", line 24, in ready
    self.module.autodiscover()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\contrib\admin\__init__.py", line 26, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\utils\module_loading.py", line 47, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\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 "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\admin.py", line 5, in <module>
    from catalog.forms import CambiarPreciosForm
  File "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\forms.py", line 83, in <module>
    class FormularioOperaciones(forms.ModelForm):
  File "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\forms.py", line 94, in FormularioOperaciones
    categorias = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=[(choice, choice) for choice in Categorias_Producto.objects.all().order_by().values_list('categoria_producto_ing', flat=True)], required=False)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 274, in __iter__
    self._fetch_all()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 1242, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 182, in __iter__
    for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\sql\compiler.py", line 1049, in results_iter
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\sql\compiler.py", line 1097, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 99, in execute
    return super().execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: catalog_categorias_producto
(anwen) PS C:\Users\Kinemed\kinemed-production\kinemed-production> python manage.py migrate --fake APPNAME zero
Traceback (most recent call last):
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: catalog_categorias_producto

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 "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\core\management\__init__.py", line 357, in execute
    django.setup()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\apps\registry.py", line 122, in populate
    app_config.ready()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\contrib\admin\apps.py", line 24, in ready
    self.module.autodiscover()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\contrib\admin\__init__.py", line 26, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\utils\module_loading.py", line 47, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\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 "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\admin.py", line 5, in <module>
    from catalog.forms import CambiarPreciosForm
  File "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\forms.py", line 83, in <module>
    class FormularioOperaciones(forms.ModelForm):
  File "C:\Users\Kinemed\kinemed-production\kinemed-production\catalog\forms.py", line 94, in FormularioOperaciones
    categorias = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=[(choice, choice) for choice in Categorias_Producto.objects.all().order_by().values_list('categoria_producto_ing', flat=True)], required=False)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 274, in __iter__
    self._fetch_all()
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 1242, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\query.py", line 182, in __iter__
    for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\sql\compiler.py", line 1049, in results_iter
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\models\sql\compiler.py", line 1097, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 99, in execute
    return super().execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\Kinemed\anaconda3\envs\anwen\lib\site-packages\django\db\backends\sqlite3\base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: catalog_categorias_producto

Upvotes: 0

Views: 42

Answers (1)

user1600649
user1600649

Reputation:

This is the problematic line:

categorias = forms.MultipleChoiceField(
    widget=forms.CheckboxSelectMultiple,
    choices=[
        (choice, choice) for choice in
        Categorias_Producto.objects.all()
        .order_by().values_list('categoria_producto_ing', flat=True)
    ],
    required=False
)

This evaluates a query at declaration time. So if the table doesn't exist yet, this creates what you're seeing. If the table already exists, then it won't cause a problem (so environments that already have the table won't error, which explains the other working ones).

It's also completely unneeded, once you learn about ModelMultipleChoiceField.

The nitty gritty

A lot of people new to python don't fully understand the import system and what is called "Declaration time": the time that the import system executes all declared code. This is code that is not part of a function or method, but is part of a declaration, such as class statements, class attributes, constants, import statements and module-level assignments.

These things are executed, not just "read", which allows you to do some very nifty stuff, like call factory functions inside the inheritance declaration of a class.

Anyway - you probably heard about lazy evaluation of querysets, which is true, but since you stuck it inside a list expression, it is in fact evaluated and executed immediately. You can see it from the import tree in the trace back: admin app's autodiscover imports the form which declares a field, which declares a keyword argument to a class constructor that contains a list expression that executes a queryet. ~:)

Upvotes: 1

Related Questions