Как бы вы выполнили несколько операторов 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 недель) но кажется, что злоупотреблять курсором таким образом - хакерство и не очень хорошая практика.
Идеи / сообщения в блоге были бы полезны.
Спасибо,
Максим.