Fixed #23909 -- Prevented crash when collecting SQL for RunSQL

Thanks James Rivett-Carnac for the report and Markus Holtermann
for the review.
This commit is contained in:
Claude Paroz 2014-12-01 11:13:01 +01:00
parent 777b4c26e3
commit e11c6fd218
3 changed files with 14 additions and 1 deletions

View File

@ -94,7 +94,11 @@ class BaseDatabaseSchemaEditor(object):
# Log the command we're running, then run it # Log the command we're running, then run it
logger.debug("%s; (params %r)" % (sql, params)) logger.debug("%s; (params %r)" % (sql, params))
if self.collect_sql: 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: else:
with self.connection.cursor() as cursor: with self.connection.cursor() as cursor:
cursor.execute(sql, params) cursor.execute(sql, params)

View File

@ -91,3 +91,6 @@ Bugfixes
the error message for cyclic dependencies much more helpful. the error message for cyclic dependencies much more helpful.
* Added missing ``index_together`` handling for SQLite (:ticket:`23880`). * 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`).

View File

@ -1289,6 +1289,12 @@ class OperationTests(OperationTestBase):
self.assertEqual(len(new_state.models["test_runsql", "somethingelse"].fields), 1) self.assertEqual(len(new_state.models["test_runsql", "somethingelse"].fields), 1)
# Make sure there's no table # Make sure there's no table
self.assertTableNotExists("i_love_ponies") 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 # Test the database alteration
with connection.schema_editor() as editor: with connection.schema_editor() as editor:
operation.database_forwards("test_runsql", editor, project_state, new_state) operation.database_forwards("test_runsql", editor, project_state, new_state)