2009-12-19 68 views
5

工作,我有以下几行代码:无法获得MySQL源代码查询使用Python MySQLdb的模块

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql" 
cursor.execute (sql) 

当我执行我的计划,我得到以下错误:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source C:\My Dropbox\workspace\projects\hosted_inv\create_site_db.sql' at line 1

现在我可以将以下内容复制到mysql中作为查询:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

它的工作原理非常完美。当我检查查询日志通过我的脚本执行的查询,它表明我的查询语句如下:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

然而,当我手动粘贴在与执行,整个create_site_db.sql获取扩展查询日志,并显示该文件中的所有sql查询。

我在这里失去了一些东西就MySQLdb的如何做查询?我是否遇到了限制?我的目标是运行一个sql脚本来创建模式结构,但我不想在shell进程中调用mysql来获取sql文件。

有什么想法?谢谢!

回答

12

正如有人说,你不能在MySQLdb的Python的API

那么使用命令source,而不是运行,加载该文件,并执行它

比方说你的.sql文件有

create database test; 

念想

sql=open("test.sql").read() 

的内容d然后执行它

cursor.execute(sql); 

您将获得新的数据库“测试”

+0

非常感谢! sql = open(“test.sql”)。read()正是我想要的。我想避免分支shell进程,因为它不仅没有必要,而且还会依赖于我执行的系统上安装的mysql客户端二进制文件。 感谢大家的帮助! – Chris 2009-12-20 00:16:45

+0

不客气的克里斯 – YOU 2009-12-20 05:34:41

3

“源”不是SQL命令,但MySQL命令行客户机的内部命令。

7

source命令仅由MySQL命令行客户识别的built-in commands之一。它不被支持为可以通过任何API执行的语句。

有些人认为您可以简单地在“;”语句结束符处分割一个SQL脚本文件,并在您获得的每一行上调用​​。但也有很多例外情况:

  • 语句是built-in commandsCONNECTSOURCECHARSETWARNINGSQUIT
  • 注意,内置命令不需要;终止例如DELIMITER 。包含;但不能作为终结,就像CREATE TRIGGER
  • 声明。包含;内字符串文字或评论,甚至带引号的标识符
  • 声明。
  • 评论线。

要以编程方式加载SQL脚本,您必须复制mysql客户端的大量功能。因此,最好是分叉一个进程,以脚本作为输入实际执行该客户端程序。

参见:

1

我相信 “源” 命令是针对mysql外壳可执行文件 - 它不是一个sql命令并且不能被正确解释n作为sql语句执行。

为了实现您的目标,您可能需要阅读脚本文件并将其解析为单个的sql语句,然后使用您的游标一次执行它们。

2

我遇到了同样的问题!

作为解决方案,我安装了库sqlparse并使用了sqlparse.split(sql)结果。我必须检查sql_parts是否包含空行作为独奏语句......否则“WOW”sqlparse非常好,正是我所需要的!

import sqlparse 
.... 
sql = open("test.sql").read() 
sql_parts = sqlparse.split(sql) 
for sql_part in sql_parts: 
    if sql_part.strip() == '': 
     continue 
    cursor.execute(sql_part) 

FYI:如果你不运行每条语句自身您可能会收到错误“命令不同步,你现在不能运行此命令”。在我向sql文件添加更多查询之后,我只有这个错误 - 不是第一次。

+0

为便利的FYI +1。 – 2010-09-15 03:33:06

+0

是不是sql_part.strip(),而不是替换位? – ssc 2010-10-20 05:13:02

+0

是的,我想带会更好,更便携(更新后)。 – Rescommunes 2010-10-30 21:46:18

相关问题