我有一个大型SQL脚本来创建我的数据库(多个表,触发器等等。使用MySQL),我需要在python程序中执行该脚本。我的旧代码做到了这一点:
sql_file = open(os.path.join(self.path_to_sql, filename), 'r')
sql_text = sql_file.read()
sql_stmts = sql_text.split(';')
for s in sql_stmts:
cursor.execute(s)
这很好用,直到我开始在我的sql脚本中包含触发器。因为我现在需要更改分隔符;为了支持每个中包含多个SQL语句的触发器,我的代码将每个语句拆分为自己的字符串不再有效,因为“分隔符”|我的脚本中的行无法正确拆分,我从cursor.execute(s)收到语法错误。
所以,我需要一些方法来告诉mysqldb立即执行整个sql脚本,而不是单独的sql语句。我试过这个:
sql_file = open(os.path.join(self.path_to_sql, filename), 'r')
sql_text = sql_file.read()
cursor.execute(sql_text)
但是,当我尝试运行该代码时出现以下错误: ProgrammingError:(2014年,“命令不同步;您现在无法运行此命令”) 我的Google-fu告诉我这是因为Python mysqldb包不支持发送到cursor.execute()的复杂SQL语句。
那我该怎么做呢?我真的想在Python中找到一种方法来完成这项工作,这样代码就可以保持完全可移植性。我们有几个程序员在Eclipse中处理这个项目,一些在Windows上,一些在Mac上,代码也需要在Linux生产服务器上工作。
如果我不能使用Python代码实际运行SQL,我如何告诉Python启动一个单独的程序来执行它?
答案 0 :(得分:2)
(不是python解决方案)你可以使用
os.system('mysql < etc')
哦,编辑(python解决方案):
如果您按行分解查询,则可以关闭并重新打开游标并按行执行。
redit:对不起,只是浏览了你的第一段。好像你刚开始做这类事情。
答案 1 :(得分:0)
这似乎不是构建多语言程序的好方法。
如果你所做的只是执行一大块sql,那么Brandon的答案真的是正确的方法。另一方面,如果你在整个作业过程中使用查询结果,那么你就不应该尝试解析一个大的,格式良好的sql脚本。相反,你应该将sql语句混合到你的python代码中。