繁体   English   中英

如何在python程序中运行复杂的sql脚本?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM