2010-10-28 22 views
4

我有一个大的SQL脚本来创建我的数据库(多个表,触发器等等,使用MySQL),我需要从一个python程序中执行这个脚本。我的旧代码这样做:如何在python程序中运行复杂的sql脚本?

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(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启动一个单独的程序来执行它?

+1

为什么“delimiter |”线路故障? – Orbit 2010-10-28 17:22:30

+0

该行失败,因为它不以;结束;所以我的代码分裂文件;不会在其结尾处分裂,并最终将格式错误的代码发送到cursor.execute()。 – CoreDumpError 2010-10-28 17:34:38

+0

你能告诉我一个包含'|'的查询吗?在我尝试回答之前,我想看看我在处理什么。 – JonnyRo 2013-07-12 04:05:13

回答

2

(不是一个Python的解决方案),可以使用

os.system('mysql < etc') 

哦,编辑(蟒蛇溶液):

如果有查询通过线断了,你可以关闭并重新打开光标按行执行。

redit:对不起,只是撇取你的第一段。看起来你一开始就在做这类事情。

+0

经过一番工作,我似乎已经得到了解决方案的工作。但是,我看到了一些奇怪的行为,所以我会继续努力。尽管如此,我真的很希望找到一个完全可以在Python中使用的解决方案,因为它确实需要完全可移植。 – CoreDumpError 2010-10-28 20:20:54

+0

经过多少工作后,我决定采用您的解决方案。我遇到的问题是我的代码中的潜在错误,直到我从外部程序(根据您的解决方案)开始加载我的DDL时才表达出来。所以你不仅帮我找到了分隔符问题的解决方案,还修复了一个非常糟糕的错误!你真棒。 – CoreDumpError 2010-10-28 23:06:31

+0

wooo <3意想不到的好后果。 – Orbit 2010-10-28 23:07:50

0

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

如果你所做的只是执行一大块sql,布兰登的回答确实是正确的选择。另一方面,如果你在整个作业过程中对查询结果进行处理,那么你不应该试图解析一个大的,格式良好的sql脚本。相反,你应该将sql语句混合到你的python代码中。

+0

我们没有对这些脚本中的查询结果做任何事情。每次我们运行单元测试时,我们只运行脚本来重新创建数据库(另一个填充测试数据),以便我们的数据始终保持一致。 你是什么意思“不是一个好方法来构建一个多语言程序”?我只是因为你的术语而感到困惑。 – CoreDumpError 2010-10-28 17:37:57

+0

多语言只是意味着你的程序中有两种编程语言,python和sql。除非解析是程序功能的核心部分,否则一种语言应该将另一种语言视为黑盒子,而不是试图以任何方式解析它。 – SingleNegationElimination 2010-10-28 17:45:58

+0

是的,这正是我想要做的!我所关心的是执行sql脚本并继续前进。只是因为分隔符问题,旧代码(我没有写入)现在会中断。我没有这个代码的附件,所以任何解决方案都可以。另外,你的意思是“Brandom的答案”?据我所知,任何名为布兰登的人都没有回答我的问题。 – CoreDumpError 2010-10-28 17:51:26