#30740 closed Bug (invalid)
collectstatic tries to connect to database
| Reported by: | PaszaVonPomiot | Owned by: | nobody |
|---|---|---|---|
| Component: | contrib.staticfiles | Version: | 2.1 |
| Severity: | Normal | Keywords: | collectstatic |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
In models.py I have a model AbcRules with attribute that queries another model:
ASSIGN_CHOICES = [team for team in sorted(set(People.objects.all().values_list("SquadName", flat=True)))]
For some reason during collectstatic execution Django tries to connect to database which fails on RedHat. The same collectstatic command will work on Windows. The problem is somewhat similar to:
https://code.djangoproject.com/ticket/17656
and maybe
https://code.djangoproject.com/ticket/23514
---> Collecting Django static files ...
Traceback (most recent call last):
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
self.connection = self.get_new_connection(conn_params)
File "/opt/app-root/lib/python3.6/site-packages/sql_server/pyodbc/base.py", line 307, in get_new_connection
timeout=timeout)
pyodbc.OperationalError: ('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "./manage.py", line 11, in <module>
execute_from_command_line(sys.argv)
File "/opt/app-root/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/opt/app-root/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute
django.setup()
File "/opt/app-root/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/opt/app-root/lib/python3.6/site-packages/django/apps/registry.py", line 112, in populate
app_config.import_models()
File "/opt/app-root/lib/python3.6/site-packages/django/apps/config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "/opt/app-root/lib64/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/opt/app-root/src/vs/models.py", line 1543, in <module>
class AbcRules(models.Model):
File "/opt/app-root/src/vs/models.py", line 1562, in TscmRules
ASSIGN_CHOICES = [team for team in sorted(set(People.objects.all().values_list("SquadName", flat=True)))]
File "/opt/app-root/lib/python3.6/site-packages/django/db/models/query.py", line 268, in __iter__
self._fetch_all()
File "/opt/app-root/lib/python3.6/site-packages/django/db/models/query.py", line 1186, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/opt/app-root/lib/python3.6/site-packages/django/db/models/query.py", line 176, in __iter__
for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
File "/opt/app-root/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1017, in results_iter
results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
File "/opt/app-root/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1052, in execute_sql
sql, params = self.as_sql()
File "/opt/app-root/lib/python3.6/site-packages/sql_server/pyodbc/compiler.py", line 176, in as_sql
supports_offset_clause = self.connection.sql_server_version >= 2012
File "/opt/app-root/lib/python3.6/site-packages/django/utils/functional.py", line 37, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/opt/app-root/lib/python3.6/site-packages/sql_server/pyodbc/base.py", line 390, in sql_server_version
with self.temporary_connection() as cursor:
File "/opt/rh/rh-python36/root/usr/lib64/python3.6/contextlib.py", line 81, in __enter__
return next(self.gen)
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 577, in temporary_connection
with self.cursor() as cursor:
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 255, in cursor
return self._cursor()
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 232, in _cursor
self.ensure_connection()
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/opt/app-root/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/opt/app-root/lib/python3.6/site-packages/django/db/backends/base/base.py", line 194, in connect
self.connection = self.get_new_connection(conn_params)
File "/opt/app-root/lib/python3.6/site-packages/sql_server/pyodbc/base.py", line 307, in get_new_connection
timeout=timeout)
django.db.utils.OperationalError: ('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
Change History (5)
comment:1 by , 6 years ago
| Component: | GIS → contrib.staticfiles |
|---|---|
| Resolution: | → invalid |
| Status: | new → closed |
comment:2 by , 6 years ago
| Resolution: | invalid |
|---|---|
| Status: | closed → new |
As suggested I have moved querying part from models.py to admin.py and used ModelForm class to modify form in admin panel. Unfortunately I got the same error during collectstatic:
class AbcRulesForm(ModelForm):
ASSIGN_CHOICES = [(team, team) for team in sorted(set(People.objects.all().values_list("SquadName", flat=True)))]
assignment = forms.ChoiceField(choices=ASSIGN_CHOICES)
class AbcRules2(admin.ModelAdmin):
form = AbcRulesForm
admin.site.register(AbcRules, AbcRules2)
File "/opt/app-root/src/vs/admin.py", line 51, in <module>
class AbcRulesForm(ModelForm):
File "/opt/app-root/src/vs/admin.py", line 52, in AbcRulesForm
ASSIGN_CHOICES = [(team, team) for team in sorted(set(People.objects.all().values_list("SquadName", flat=True)))]
...
django.db.utils.OperationalError: ('HYT00', '[HYT00] [unixODBC][Microsoft][ODBC Driver 13 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
Above solution works on Windows but fails on RedHat.
Again 'collectstatic' should never connect to database.
comment:3 by , 6 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Being in admin.py or in models.py, the query is still run at import time.
Please use wiki:TicketClosingReasons/UseSupportChannels
comment:4 by , 6 years ago
| Resolution: | fixed → invalid |
|---|
comment:5 by , 6 years ago
The solution was to use ModelChoiceField in admin.py for ModelForm class that was used in AdminModel class for that particular model.
I would say that querying the database at module import time is a very bad idea, so you should find a different way to populate your choices attribute (the choices might be better suited at the form level).