[英]Executing several SQL queries with MySQLdb
你会如何使用python执行几个SQL语句(脚本模式)?
试着这样做:
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周),但似乎滥用光标此方式是hackish,而不是一个好的做法。
想法/博客文章会有所帮助。
谢谢,
格言。
以下是使用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()
在游标对象上调用executemany方法。 更多信息: http : //mysql-python.sourceforge.net/MySQLdb.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.