使用MySQLdb在Python中执行.sql文件

使用MySQLdb在Python中执行.sql文件,python,mysql,mysql-python,Python,Mysql,Mysql Python,我有一个.sql文件,其中包含一组sql查询,每个查询跨越多行。我想通过Python使用MySQLdb在MySQL中执行这些查询 ,但在MySQLdb中似乎没有任何等效函数 我注意到有人问同样的问题,但我发现答案并不令人满意。答案基本上是: 使用subprocess运行mysql命令并将其发送到.sql文件 这是可行的,但它相当不雅观,并且在错误处理等方面引入了不必要的复杂性 如果每个查询都在一行上,只需分别执行每一行即可 但在我的例子中,它们跨越多条线,所以这不起作用 如果每个查询不在一行上,

我有一个.sql文件,其中包含一组sql查询,每个查询跨越多行。我想通过Python使用
MySQLdb
在MySQL中执行这些查询

,但在
MySQLdb
中似乎没有任何等效函数

我注意到有人问同样的问题,但我发现答案并不令人满意。答案基本上是:

使用
subprocess
运行
mysql
命令并将其发送到.sql文件

这是可行的,但它相当不雅观,并且在错误处理等方面引入了不必要的复杂性

如果每个查询都在一行上,只需分别执行每一行即可

但在我的例子中,它们跨越多条线,所以这不起作用

如果每个查询不在一行上,请以某种方式将它们连接起来


但是,如何?我的意思是,我可以很容易地整理一些东西,所以你没有必要在这里用半生不熟的答案来回答,也许这就是我最终要做的,但是已经有一个现成的图书馆可以这样做了吗?我更喜欢一个全面、正确的解决方案,而不是黑客攻击。

MySQLdb
似乎允许这种开箱即用的解决方案,您只需调用
cursor.nextset()
来循环返回的结果集

db = conn.cursor()
db.execute('SELECT 1; SELECT 2;')

more = True
while more:
    print db.fetchall()
    more = db.nextset()
如果您想绝对确保对此的支持已启用,和/或禁用该支持,可以使用以下方法:

MYSQL_OPTION_MULTI_STATEMENTS_ON = 0
MYSQL_OPTION_MULTI_STATEMENTS_OFF = 1

conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)
# Multiple statement execution here...
conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_OFF)

我已经提交了一个包含解析文件和构建查询的答案,但我认为这就是你所说的“黑客”的意思,所以我删除了它。MySQL。sql脚本包含一些由
MySQL
客户端处理的脚本,但服务器中的sql解析器无法识别。因此,即使MySQLdb可以支持多查询,您也不能将任意的.sql脚本作为输入提供给它。@aleksi您假设了危险的假设:我认为我不会处理大文件(x100MB+),甚至更小的文件。命令上没有生成器。即使设置命令生成器也很困难,因为您需要SQL文件解析器;一行一行不一定行得通。用分号表示是不好的。等等@BerryTsakala:我很难理解你的评论。也就是说;是的,我做了一些假设,这种方法不会适用于每一个用例(正如上面比尔已经很好地指出的),但它或多或少正是这个问题所要求的。你说的“危险”到底是什么意思?这是非常安全的,不像自己尝试解析SQL查询。是的,这对大文件不起作用,你会遇到MySQL的最大数据包大小。既然此方法显式地避免了解析SQL,为什么要谈论解析SQL?