我有一个大的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启动一个单独的程序来执行它?
为什么“delimiter |”线路故障? – Orbit 2010-10-28 17:22:30
该行失败,因为它不以;结束;所以我的代码分裂文件;不会在其结尾处分裂,并最终将格式错误的代码发送到cursor.execute()。 – CoreDumpError 2010-10-28 17:34:38
你能告诉我一个包含'|'的查询吗?在我尝试回答之前,我想看看我在处理什么。 – JonnyRo 2013-07-12 04:05:13