无法使用Python mysqldb模块执行MySQL源查询

6 投票
5 回答
4898 浏览
提问于 2025-04-15 17:11

我有以下几行代码:

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 个回答

3

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

8

source命令是mysql命令行客户端的一种内置命令,只有这个客户端能识别它。其他的API并不支持这个命令。

有些人认为可以简单地把一个SQL脚本文件按";"这个结束符号分开,然后对每一行调用execute()。但实际上,有很多例外情况:

  • CONNECTSOURCECHARSETWARNINGSQUIT这些内置命令。
  • 要注意,内置命令不需要以;结束,比如DELIMITER
  • 一些语句虽然包含;,但不是结束符,比如CREATE TRIGGER
  • 语句中如果在字符串字面量、注释或者引号标识符里包含;
  • 注释行。

如果想要通过程序加载一个SQL脚本,你需要实现很多mysql客户端的功能。所以最好是直接启动一个进程,运行这个客户端程序,并把脚本作为输入。

另请参见:

13

正如其他人所说,你不能在MySQLdb的Python接口中使用source这个命令。

所以,不要直接运行这个命令,而是要加载文件并执行它。

假设你的.sql文件内容是:

create database test;

你可以像这样读取内容:

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

然后执行它:

cursor.execute(sql);

这样你就会得到一个新的数据库“test”。

撰写回答