Files
app-store-optimization/skills/loki-mode/benchmarks/results/2026-01-05-10-37-54/swebench-loki-patches/django__django-13448.patch

94 lines
3.9 KiB
Diff

# django__django-13448
# Loki Mode Multi-Agent Patch
# Attempts: 1
Based on the issue description and the architect's analysis, I can generate the patch. The bug is that when `TEST: {"MIGRATE": False}` is set, `serialize_db_to_string()` is still called and tries to query tables that don't exist. The fix needs to run `syncdb` to create tables when migrations are skipped.
```
--- a/django/db/backends/base/creation.py
+++ b/django/db/backends/base/creation.py
@@ -58,6 +58,7 @@ class BaseDatabaseCreation:
test_database_name = self._get_test_db_name()
if verbosity >= 1:
+ from django.apps import apps
action = 'Creating'
if keepdb:
action = "Using existing"
@@ -69,14 +70,25 @@ class BaseDatabaseCreation:
# We then serialize the current state of the database into a string
# and store it on the connection. This slightly horrific process is so people
# who are testing on databases without transactions or parties who are
- # for the entire duration of the tests.
+ # using TransactionTestCase can ensure each test runs on a fresh database.
if serialize:
self.connection._test_serialized_contents = self.serialize_db_to_string()
call_command('createcachetable', database=self.connection.alias)
- # Ensure a connection for the side effect of initializing the test database.
- self.connection.ensure_connection()
+ if migrate:
+ call_command(
+ 'migrate',
+ verbosity=max(verbosity - 1, 0),
+ interactive=False,
+ database=self.connection.alias,
+ run_syncdb=True,
+ )
+ else:
+ # If migrations are disabled, run syncdb to create tables
+ # by pretending all apps have no migrations.
+ from django.apps import apps
+ from django.conf import settings
return test_database_name
```
Wait, let me reconsider. Looking at the traceback more carefully:
1. `create_test_db` is called with `serialize=True` (default)
2. When `migrate=False`, migrations are skipped
3. But `serialize_db_to_string()` is still called, which tries to query all tables
4. Since tables don't exist (no migrations ran), it fails
The fix should either:
1. Skip serialization when `migrate=False`, OR
2. Run `syncdb` to create tables when `migrate=False`
The architect suggests option 2 - running syncdb with mocked `MIGRATION_MODULES`. Here's the correct patch:
--- a/django/db/backends/base/creation.py
+++ b/django/db/backends/base/creation.py
@@ -51,6 +51,8 @@ class BaseDatabaseCreation:
database with the confirm parameter. Returns the name of the test
database created.
"""
+ from django.apps import apps
+
# We could skip this call if keepdb is True, but we instead
# give it the keepdb param. This is to handle the case
# where the test DB doesn't exist, in which case we need to
@@ -71,6 +73,17 @@ class BaseDatabaseCreation:
database=self.connection.alias,
run_syncdb=True,
)
+ else:
+ # Disable migrations for all apps when MIGRATE is False
+ # but still call migrate --run-syncdb to create tables.
+ from django.core.management import call_command
+ from unittest.mock import patch
+
+ with patch.object(settings, 'MIGRATION_MODULES', {
+ app.label: None for app in apps.get_app_configs()
+ }):
+ call_command(
+ 'migrate',
+ verbosity=max(verbosity - 1, 0),
+ interactive=False,
+ database=self.connection.alias,
+ run_syncdb=True,
+ )
# We then serialize the current state of the database into a string
# and store it on the connection. This slightly horrific process is so people