使用Python mysqldb模块无法使MySQL源查询工作

时间:2009-12-19 07:52:16

标签: python mysql scripting

我有以下几行代码:

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

当我执行程序时,出现以下错误:

  

错误1064:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第1行的“源C:\ My Dropbox \ workspace \ projects \ hosted_inv \ create_site_db.sql”附近​​使用正确的语法

现在我可以将以下内容复制并发送到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文件。

有什么想法?谢谢!

5 个答案:

答案 0 :(得分:12)

正如其他人所说,你不能在MySQLdb Python API中使用命令source

因此,不是运行它,而是加载文件并执行它

假设你的.sql文件有

create database test;

阅读

等内容
sql=open("test.sql").read()

然后执行它

cursor.execute(sql);

您将获得新数据库“test”

答案 1 :(得分:7)

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

有些人认为您可以简单地在“;”语句终止符上拆分SQL脚本文件,并在每行上调用execute()。但是有很多例外情况:

  • built-in commands语句,如CONNECTSOURCECHARSETWARNINGSQUIT等。
  • 请注意,内置命令不需要在;中终止,例如DELIMITER
  • 包含;但不作为终止符的语句,例如CREATE TRIGGER
  • 在字符串文字或注释或甚至带引号的标识符中包含;的语句。
  • 评论专栏。

要以编程方式加载SQL脚本,您必须复制相当数量的mysql客户端功能。因此,最好只使用脚本作为输入来分叉进程以实际执行该客户端程序。

另见:

答案 2 :(得分:3)

'source'不是SQL命令,而是mysql命令行客户端的内部命令。

答案 3 :(得分:2)

我遇到了同样的问题!

作为解决方案,我安装了库sqlparse并使用了sqlparse.split(sql)结果。我不得不检查sql_parts是否包含空白行作为solo语句...否则“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 )

仅供参考:如果您没有单独运行每个语句,您可能会收到错误“命令不同步;您现在无法运行此命令”。我在我的sql文件中添加了更多查询后才出现此错误 - 这不是第一次。

答案 4 :(得分:1)

我认为“source”命令特定于mysql shell可执行文件 - 它不是sql命令,并且在作为sql语句执行时无法正确解释。

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