我有以下几行代码:
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文件。
有什么想法?谢谢!
答案 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()
。但是有很多例外情况:
CONNECT
,SOURCE
,CHARSET
,WARNINGS
,QUIT
等。;
中终止,例如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语句,然后使用光标一次执行一个。