无法使用Python mysqldb模块执行MySQL源查询
我有以下几行代码:
sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql"
cursor.execute (sql)
当我运行我的程序时,出现了以下错误:
错误 1064:你的 SQL 语法有误;请检查与你的 MySQL 服务器版本相对应的手册,看看在第 1 行附近使用正确的语法,错误出现在 'source 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 个回答
'source' 不是一个 SQL 命令,而是 mysql 命令行客户端的一个内部命令。
source
命令是mysql命令行客户端的一种内置命令,只有这个客户端能识别它。其他的API并不支持这个命令。
有些人认为可以简单地把一个SQL脚本文件按";
"这个结束符号分开,然后对每一行调用execute()
。但实际上,有很多例外情况:
- 像
CONNECT
、SOURCE
、CHARSET
、WARNINGS
、QUIT
这些内置命令。 - 要注意,内置命令不需要以
;
结束,比如DELIMITER
。 - 一些语句虽然包含
;
,但不是结束符,比如CREATE TRIGGER
。 - 语句中如果在字符串字面量、注释或者引号标识符里包含
;
。 - 注释行。
如果想要通过程序加载一个SQL脚本,你需要实现很多mysql客户端的功能。所以最好是直接启动一个进程,运行这个客户端程序,并把脚本作为输入。
另请参见:
正如其他人所说,你不能在MySQLdb的Python接口中使用source
这个命令。
所以,不要直接运行这个命令,而是要加载文件并执行它。
假设你的.sql文件内容是:
create database test;
你可以像这样读取内容:
sql=open("test.sql").read()
然后执行它:
cursor.execute(sql);
这样你就会得到一个新的数据库“test”。