如何在Python程序中运行复杂的SQL脚本?
我有一个很大的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语句,所以我用来把每个语句分开的代码就不再有效了,因为脚本中的“delimiter |”这一行没有正确分割,导致我在执行时出现了语法错误。
所以,我需要一种方法来告诉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, "Commands out of sync; you can't run this command now") 我在网上查了一下,发现这是因为Python的mysqldb库不支持将复杂的SQL语句发送给cursor.execute()。
那我该怎么做呢?我真的希望能在Python中找到一个方法,这样代码就可以完全移植。我们有几个程序员在这个项目上工作,有些在Windows上,有些在Mac上,代码还需要在Linux的生产服务器上运行。
如果我不能用Python代码来直接运行SQL,那我该怎么告诉Python去启动一个单独的程序来执行它呢?
2 个回答
这看起来不是一个很好的多语言程序结构方式。
如果你只是想执行一大段SQL语句,Brandon的回答其实是最合适的。
但是,如果你在处理工作的过程中需要对查询结果进行操作,那就不应该尝试解析一大段格式良好的SQL脚本。相反,你应该把SQL语句和你的Python代码混合在一起。
(这不是一个Python的解决方案)你可以使用
os.system('mysql < etc')
哦,补充一下(Python的解决方案):
如果你的查询是按行分开的,你可以关闭并重新打开光标,然后逐行执行。
补充:抱歉,我只扫了一眼你的第一段。看起来你一开始就是在做这种事情。