[英]How do you run a complex sql script within a python program?
我有一个用于创建数据库的大型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软件包不支持将复杂的SQL语句发送到cursor.execute()。
那我该怎么做呢? 我真的很想找到一种完全在Python内完成此操作的方法,以使代码保持完全可移植性。 我们有几个程序员在Eclipse中从事这个项目,一些在Windows上,一些在Mac上,并且代码也需要在Linux生产服务器上工作。
如果我不能使用Python代码实际运行SQL,如何告诉Python启动一个单独的程序来执行它?
(不是python解决方案)可以使用
os.system('mysql < etc')
哦,编辑(Python解决方案):
如果查询按行拆分,则可以关闭并重新打开游标,然后按行执行。
重做:抱歉,只浏览了您的第一段。 好像你刚开始做这种事情。
这似乎不是构造多语言程序的好方法。
如果您要做的只是执行大量sql,Brandon的答案确实是正确的方法。
另一方面,如果您在整个工作过程中都在使用查询结果,那么您不应尝试解析大型的格式正确的sql脚本。 相反,您应该将sql语句混入您的python代码中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.