'#23426 - RunSQL should accept parameters.'

def test_run_sql_params(self):

    project_state = self.set_up_test_model('test_runsql')
    operation = migrations.RunSQL(['CREATE    TABLE    i_love_ponies    (id    int,    special_thing    varchar(15));'], ['DROP    TABLE    i_love_ponies'])
    param_operation = migrations.RunSQL(("INSERT    INTO    i_love_ponies    (id,    special_thing)    VALUES    (1,    'Django');", ['INSERT    INTO    i_love_ponies    (id,    special_thing)    VALUES    (2,    %s);', ['Ponies']], ('INSERT    INTO    i_love_ponies    (id,    special_thing)    VALUES    (%s,    %s);', (3, 'Python'))), ["DELETE    FROM    i_love_ponies    WHERE    special_thing    =    'Django';", ["DELETE    FROM    i_love_ponies    WHERE    special_thing    =    'Ponies';", None], ('DELETE    FROM    i_love_ponies    WHERE    id    =    %s    OR    special_thing    =    %s;', [3, 'Python'])])
    self.assertTableNotExists('i_love_ponies')
    new_state = project_state.clone()
    with connection.schema_editor() as editor:
        operation.database_forwards('test_runsql', editor, project_state, new_state)
    with connection.schema_editor() as editor:
        param_operation.database_forwards('test_runsql', editor, project_state, new_state)
    with connection.cursor() as cursor:
        cursor.execute('SELECT    COUNT(*)    FROM    i_love_ponies')
        self.assertEqual(cursor.fetchall()[0][0], 3)
    with connection.schema_editor() as editor:
        param_operation.database_backwards('test_runsql', editor, new_state, project_state)
    with connection.cursor() as cursor:
        cursor.execute('SELECT    COUNT(*)    FROM    i_love_ponies')
        self.assertEqual(cursor.fetchall()[0][0], 0)
    with connection.schema_editor() as editor:
        operation.database_backwards('test_runsql', editor, new_state, project_state)
    self.assertTableNotExists('i_love_ponies')
