From e11c6fd2184a9e7b23c777e5824f9ded6221d905 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Mon, 1 Dec 2014 11:13:01 +0100 Subject: [PATCH] Fixed #23909 -- Prevented crash when collecting SQL for RunSQL Thanks James Rivett-Carnac for the report and Markus Holtermann for the review. --- django/db/backends/schema.py | 6 +++++- docs/releases/1.7.2.txt | 3 +++ tests/migrations/test_operations.py | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/django/db/backends/schema.py b/django/db/backends/schema.py index aa13e421d43..594a360c972 100644 --- a/django/db/backends/schema.py +++ b/django/db/backends/schema.py @@ -94,7 +94,11 @@ class BaseDatabaseSchemaEditor(object): # Log the command we're running, then run it logger.debug("%s; (params %r)" % (sql, params)) if self.collect_sql: - self.collected_sql.append((sql % tuple(map(self.quote_value, params))) + ";") + ending = "" if sql.endswith(";") else ";" + if params is not None: + self.collected_sql.append((sql % tuple(map(self.quote_value, params))) + ending) + else: + self.collected_sql.append(sql + ending) else: with self.connection.cursor() as cursor: cursor.execute(sql, params) diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 9ed58bb217e..c01dca9f583 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -91,3 +91,6 @@ Bugfixes the error message for cyclic dependencies much more helpful. * Added missing ``index_together`` handling for SQLite (:ticket:`23880`). + +* Fixed a crash when ``RunSQL`` SQL content was collected by the schema editor, + typically when using ``sqlmigrate`` (:ticket:`23909`). diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 1fa5b5f1428..0378b86f02d 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1289,6 +1289,12 @@ class OperationTests(OperationTestBase): self.assertEqual(len(new_state.models["test_runsql", "somethingelse"].fields), 1) # Make sure there's no table self.assertTableNotExists("i_love_ponies") + # Test SQL collection + with connection.schema_editor(collect_sql=True) as editor: + operation.database_forwards("test_runsql", editor, project_state, new_state) + self.assertIn("LIKE '%%ponies';", "\n".join(editor.collected_sql)) + operation.database_backwards("test_runsql", editor, project_state, new_state) + self.assertIn("LIKE '%%Ponies%%';", "\n".join(editor.collected_sql)) # Test the database alteration with connection.schema_editor() as editor: operation.database_forwards("test_runsql", editor, project_state, new_state)