Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python程序中运行复杂的sql脚本?_Python_Sql_Mysql - Fatal编程技术网

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

如何在python程序中运行复杂的sql脚本?,python,sql,mysql,Python,Sql,Mysql,我有一个创建数据库的大型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脚本(使用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 |”行无法正确拆分,并且我从cursor.execute中得到语法错误

因此,我需要某种方法来告诉mysqldb立即执行整个sql脚本,而不是单个sql语句。我试过这个:

sql_file = open(os.path.join(self.path_to_sql, filename), 'r')
sql_text = sql_file.read()
cursor.execute(sql_text)
但是,当我尝试运行该代码时,出现以下错误: 编程错误:(2014,“命令不同步;您现在无法运行此命令”) 我的Google fu告诉我,这是因为Python mysqldb包不支持将复杂的SQL语句发送到cursor.execute()

那我该怎么做呢?我真的很想找到一种完全在Python中实现这一点的方法,这样代码就可以保持完全的可移植性。我们有几个程序员在Eclipse中处理这个项目,一些在Windows上,一些在Mac上,代码也需要在Linux生产服务器上工作

如果我不能使用Python代码来实际运行SQL,我怎么能告诉Python启动一个单独的程序来执行它呢?

(不是Python解决方案)您可以使用

  os.system('mysql < etc')
os.system('mysql
编辑(python解决方案):

如果查询按行分解,则可以关闭并重新打开光标,然后按行执行


对不起,只浏览了你的第一段。看起来你一开始是在做这类事情。

这似乎不是构造多语言程序的好方法

如果您所做的只是执行一大块sql,那么Brandon的答案确实是正确的


另一方面,如果在作业的整个过程中都在处理查询结果,那么就不应该尝试解析大型、格式良好的sql脚本。相反,您应该将sql语句混合到python代码中

为什么“delimiter |”行失败?该行失败是因为它没有以;,因此,我的代码分割的文件上;不会在结尾拆分,并最终向cursor.execute()发送格式错误的代码。能否显示一个包含“|”的查询。在我尝试回答之前,我想看看我在处理什么。我很欣赏@JonnyRo的想法,但我在近三年前提出了这个问题,而且很久以前就得到了帮助。我们没有对这些脚本中的查询结果做任何事。每次运行单元测试时,我们只需运行脚本来重新创建数据库(另一个脚本用测试数据填充数据库),以便数据始终保持一致。你所说的“不是构建多语言程序的好方法”是什么意思?我只是被你的术语弄糊涂了。多语言只是意味着你的程序中有两种编程语言,python和sql。除非解析是程序功能的核心部分,否则一种语言应该将另一种语言视为黑盒,而不是试图以任何方式解析它。是的,这正是我想要做的!我所关心的只是执行sql脚本并继续。只是因为分隔符问题,旧代码(我没有编写)现在中断了。我没有这个代码的附件,所以任何解决方案都可以。还有,你说的“布兰登的答案”是什么意思?据我所知,任何一个叫布兰登的人都没有回答我的问题。@Core:布兰登早些时候有一个答案;看起来他把它删除了。www:(.有人记得他说过什么吗?我真的需要一个解决方案。经过一段时间的工作,我似乎已经让你的解决方案起作用了。但是,我看到它有一些奇怪的行为,所以我将继续努力。不过,我真的很想找到一个完全在Python中工作的解决方案,因为这确实需要完全可移植e、 在做了更多的工作之后,我决定采用您的解决方案。我遇到的问题是代码中潜在的bug,这些bug在我开始从外部程序加载DDL(根据您的解决方案)之前都没有表现出来.所以你不仅帮我找到了分隔符问题的解决方案,还修复了一个非常糟糕的错误!你太棒了。这个答案在2018年会有什么变化?