Opened 5 years ago
Closed 5 years ago
#31888 closed Cleanup/optimization (fixed)
Test loader accesses MySQL before database is created.
| Reported by: | Ahmad A. Hussein | Owned by: | Ahmad A. Hussein |
|---|---|---|---|
| Component: | Core (Other) | Version: | dev |
| Severity: | Normal | Keywords: | mysql |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | yes | UI/UX: | no |
Description
Tests fail on the MySQL backend because the test runner accesses the database while loading tests prior to database creation. This happens in annotations.tests and aggregation.tests.
While the test runner loads the tests, it invokes their skipIf statements making calls to the database on [https://github.com/django/django/blob/master/tests/aggregation/tests.py#L1208 L1208. This causes an exception because the database does not yet exist and the settings have not been configured.
Relevant traceback:
(parallelpr) c:\Users\ahmad\Desktop\Projects\DjangoGSOC\tests>runtests.py --parallel=1 --settings=test_mysql aggregation.tests
Testing against Django installed in 'c:\users\ahmad\desktop\projects\djangogsoc\django'
Traceback (most recent call last):
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 220, in ensure_connection
self.connect()
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 201, in connect
self.connection = self.get_new_connection(conn_params)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\mysql\base.py", line 234, in get_new_connection
return Database.connect(**conn_params)
File "C:\Users\ahmad\Envs\parallelpr\lib\site-packages\MySQLdb\__init__.py", line 84, in Connect
return Connection(*args, **kwargs)
File "C:\Users\ahmad\Envs\parallelpr\lib\site-packages\MySQLdb\connections.py", line 179, in __init__
super(Connection, self).__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (1049, "Unknown database 'main'")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\ahmad\Desktop\Projects\DjangoGSOC\tests\runtests.py", line 574, in <module>
failures = django_tests(
File "C:\Users\ahmad\Desktop\Projects\DjangoGSOC\tests\runtests.py", line 314, in django_tests
failures = test_runner.run_tests(
File "c:\users\ahmad\desktop\projects\djangogsoc\django\test\runner.py", line 754, in run_tests
suite = self.build_suite(test_labels, extra_tests, process_setup, process_setup_args)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\test\runner.py", line 593, in build_suite
tests = self.test_loader.loadTestsFromName(label)
File "c:\users\ahmad\appdata\local\programs\python\python38\lib\unittest\loader.py", line 154, in loadTestsFromName
module = __import__(module_name)
File "C:\Users\ahmad\Desktop\Projects\DjangoGSOC\tests\aggregation\tests.py", line 21, in <module>
class AggregateTestCase(TestCase):
File "C:\Users\ahmad\Desktop\Projects\DjangoGSOC\tests\aggregation\tests.py", line 1208, in AggregateTestCase
connection.vendor == 'mysql' and 'ONLY_FULL_GROUP_BY' in connection.sql_mode,
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\__init__.py", line 28, in __getattr__
return getattr(connections[DEFAULT_DB_ALIAS], item)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\mysql\base.py", line 398, in sql_mode
sql_mode = self.mysql_server_data['sql_mode']
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\mysql\base.py", line 359, in mysql_server_data
with self.temporary_connection() as cursor:
File "c:\users\ahmad\appdata\local\programs\python\python38\lib\contextlib.py", line 113, in __enter__
return next(self.gen)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 604, in temporary_connection
with self.cursor() as cursor:
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 260, in cursor
return self._cursor()
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 236, in _cursor
self.ensure_connection()
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 220, in ensure_connection
self.connect()
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 220, in ensure_connection
self.connect()
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\base\base.py", line 201, in connect
self.connection = self.get_new_connection(conn_params)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\utils\asyncio.py", line 26, in inner
return func(*args, **kwargs)
File "c:\users\ahmad\desktop\projects\djangogsoc\django\db\backends\mysql\base.py", line 234, in get_new_connection
return Database.connect(**conn_params)
File "C:\Users\ahmad\Envs\parallelpr\lib\site-packages\MySQLdb\__init__.py", line 84, in Connect
return Connection(*args, **kwargs)
File "C:\Users\ahmad\Envs\parallelpr\lib\site-packages\MySQLdb\connections.py", line 179, in __init__
super(Connection, self).__init__(*args, **kwargs2)
django.db.utils.OperationalError: (1049, "Unknown database 'main'")
Change History (5)
comment:1 by , 5 years ago
comment:2 by , 5 years ago
| Component: | Database layer (models, ORM) → Core (Other) |
|---|---|
| Easy pickings: | set |
| Summary: | Test loader accesses MySQL before database is created → Test loader accesses MySQL before database is created. |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Bug → Cleanup/optimization |
Agreed, we should be able to fix this by moving checks to tests, e.g.
diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py
index c738cbb27e..dfdf53a86e 100644
--- a/tests/aggregation/tests.py
+++ b/tests/aggregation/tests.py
@@ -1204,16 +1204,16 @@ class AggregateTestCase(TestCase):
])
@skipUnlessDBFeature('supports_subqueries_in_group_by')
- @skipIf(
- connection.vendor == 'mysql' and 'ONLY_FULL_GROUP_BY' in connection.sql_mode,
- 'GROUP BY optimization does not work properly when ONLY_FULL_GROUP_BY '
- 'mode is enabled on MySQL, see #31331.',
- )
def test_aggregation_subquery_annotation_multivalued(self):
"""
Subquery annotations must be included in the GROUP BY if they use
potentially multivalued relations (contain the LOOKUP_SEP).
"""
+ if connection.vendor == 'mysql' and 'ONLY_FULL_GROUP_BY' in connection.sql_mode:
+ self.skipTest(
+ 'GROUP BY optimization does not work properly when '
+ 'ONLY_FULL_GROUP_BY mode is enabled on MySQL, see #31331.'
+ )
subquery_qs = Author.objects.filter(
pk=OuterRef('pk'),
book__name=OuterRef('book__name'),
Do you want to prepare a patch?
comment:3 by , 5 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
That was the approach I imagined as well. I was looking through the documentation for that.
I'll definitely prepare the patch.
Removing this change fixes this issue on
aggregation.tests