Выполнение нескольких запросов SQL с MySQLdb - PullRequest
3 голосов
/ 06 января 2011

Как бы вы выполнили несколько операторов SQL (режим сценария) с помощью python?

Попытка сделать что-то вроде этого:

import MySQLdb
mysql = MySQLdb.connect(host='host...rds.amazonaws.com', db='dbName', user='userName', passwd='password')
sql = """
insert into rollout.version (`key`, `value`) VALUES ('maxim0', 'was here0');
insert into rollout.version (`key`, `value`) VALUES ('maxim1', 'was here1');
insert into rollout.version (`key`, `value`) VALUES ('maxim2', 'was here1');
"""
mysql.query(sql)

Сбой с:

ProgrammingError: (2014, «Команды выводятся» синхронизации; вы не можете запустить эту команду сейчас ")

Я пишу механизм развертывания, который будет принимать изменения дельты SQL от нескольких человек и применять их к БД при развертывании версии.

Я изучил этот код http://sujitpal.blogspot.com/2009/02/python-sql-runner.html и реализовал __sanitize_sql:

def __sanitize_sql(sql):
    # Initial implementation from http://sujitpal.blogspot.com/2009/02/python-sql-runner.html
    sql_statements = []

    incomment = False
    in_sqlcollect = False

    sql_statement = None
    for sline in sql.splitlines():
        # Remove white space from both sides.
        sline = sline.strip()

        if sline.startswith("--") or len(sline) == 0:
            # SQL Comment line, skip
            continue

        if sline.startswith("/*"):
            # start of SQL comment block
            incomment = True
        if incomment and sline.endswith("*/"):
            # end of SQL comment block
            incomment = False
            continue

        # Collect line which is part of 
        if not incomment:
            if sql_statement is None:
                sql_statement = sline
            else:
                sql_statement += sline

            if not sline.endswith(";"):
                in_sqlcollect = True

            if not in_sqlcollect:
                sql_statements.append(sql_statement)
                sql_statement = None
                in_sqlcollect = False

    if not incomment and not sql_statement is None and len(sql_statement) != 0:
        sql_statements.append(sql_statement)

    return sql_statements

if __name__ == "__main__":
    sql = sql = """update tbl1;
/* This
is my
beautiful 
comment*/
/*this is comment #2*/
some code...;
-- comment
sql code
"""
    print __sanitize_sql(sql)

Не знаю, является ли это лучшим решением, но, похоже, оно работает не слишком сложно для анализа операторов SQL.

Теперь вопрос, как запустить этот код, я могу сделать что-то вроде этого чувака но это кажется уродливым, я не эксперт по Python (мы делали Python здесь только для последних 2 недель) но кажется, что злоупотреблять курсором таким образом - хакерство и не очень хорошая практика.

Идеи / сообщения в блоге были бы полезны.

Спасибо,
Максим.

Ответы [ 2 ]

1 голос
/ 28 июня 2013

Вот как вы можете использовать executemany():

import MySQLdb
connection = MySQLdb.connect(host='host...rds.amazonaws.com', db='dbName', user='userName', passwd='password')
cursor = connection.cursor()

my_data_to_insert = [['maxim0', 'was here0'], ['maxim1', 'was here1'], ['maxim2', 'was here1']]
sql = "insert into rollout.version (`key`, `value`) VALUES (%s, %s);"

cursor.executemany(sql, my_data_to_insert)

connection.commit()
connection.close()
0 голосов
/ 06 января 2011

Вызвать метод executemany для объекта курсора.Более подробная информация здесь: http://mysql -python.sourceforge.net / MySQLdb.html

...