summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2014-08-28 14:12:49 -0400
committerSimon Charette <charette.s@gmail.com>2014-08-28 15:23:46 -0400
commitc32c220881ebca2be7b7bb5bec6ca4b25d1d6454 (patch)
tree34e903022368fced4dc2343126c39edd84419905
parent419f9075c4458bbf4618fd94ac9a03ac7301efa0 (diff)
[1.7.x] Fixed #23379 -- Corrected a referencing issue in sql_create.
Thanks to Trac alias flakfizer for the report. Backport of 1e404180c1 from master
-rw-r--r--django/core/management/sql.py2
-rw-r--r--tests/commands_sql/tests.py26
2 files changed, 22 insertions, 6 deletions
diff --git a/django/core/management/sql.py b/django/core/management/sql.py
index 323cb5423d..a834627c38 100644
--- a/django/core/management/sql.py
+++ b/django/core/management/sql.py
@@ -36,7 +36,7 @@ def sql_create(app_config, style, connection):
# We trim models from the current app so that the sqlreset command does not
# generate invalid SQL (leaving models out of known_models is harmless, so
# we can be conservative).
- app_models = app_config.get_models(include_auto_created=True)
+ app_models = list(app_config.get_models(include_auto_created=True))
final_output = []
tables = connection.introspection.table_names()
known_models = set(model for model in connection.introspection.installed_models(tables) if model not in app_models)
diff --git a/tests/commands_sql/tests.py b/tests/commands_sql/tests.py
index 8360648e51..d057883728 100644
--- a/tests/commands_sql/tests.py
+++ b/tests/commands_sql/tests.py
@@ -1,5 +1,7 @@
from __future__ import unicode_literals
+import re
+
from django.apps import apps
from django.core.management.color import no_style
from django.core.management.sql import (sql_create, sql_delete, sql_indexes,
@@ -19,11 +21,25 @@ class SQLCommandsTestCase(TestCase):
def test_sql_create(self):
app_config = apps.get_app_config('commands_sql')
output = sql_create(app_config, no_style(), connections[DEFAULT_DB_ALIAS])
- create_tables = [o for o in output if o.startswith('CREATE TABLE')]
- self.assertEqual(len(create_tables), 3)
- # Lower so that Oracle's upper case tbl names wont break
- sql = create_tables[-1].lower()
- six.assertRegex(self, sql, r'^create table .commands_sql_book.*')
+
+ tables = set()
+ create_table_re = re.compile(r'^create table .(?P<table>[\w_]+).*', re.IGNORECASE)
+ reference_re = re.compile(r'.* references .(?P<table>[\w_]+).*', re.IGNORECASE)
+ for statement in output:
+ create_table = create_table_re.match(statement)
+ if create_table:
+ tables.add(create_table.group('table'))
+ continue
+ reference = reference_re.match(statement)
+ if reference:
+ table = reference.group('table')
+ self.assertIn(
+ table, tables, "The table %s is referenced before its creation." % table
+ )
+
+ self.assertEqual(tables, {
+ 'commands_sql_comment', 'commands_sql_book', 'commands_sql_book_comments'
+ })
def test_sql_delete(self):
app_config = apps.get_app_config('commands_sql')