【问题标题】:Execute .sql file in Python with MySQLdb使用 MySQLdb 在 Python 中执行 .sql 文件
【发布时间】:2012-05-22 13:26:15
【问题描述】:

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

sqlite3 has "a nonstandard shortcut" for this purpose called executescript(),但MySQLdb中似乎没有任何等效功能。

我注意到this old question from 2 years ago 提出了同样的问题,但我发现答案并不令人满意。答案基本上是:

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

这行得通,但它相当不优雅,并且它通过错误处理等引入了不必要的复杂性。

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

但就我而言,它们跨越多行,所以这行不通。

如果每个查询不在一行上,请以某种方式加入它们。

但是,怎么做?我的意思是,我可以很容易地破解一些东西,所以你不需要在这里回答半生不熟的答案,也许这就是我最终要做的,但是否已经有一个成熟的图书馆可以做到这一点?比起 hack,我更愿意使用全面且正确的解决方案。

【问题讨论】:

  • 我已经提交了一个涉及解析文件和构建查询的答案,但我认为这就是你所说的“黑客”的意思,所以我删除了它。

标签: python mysql mysql-python


【解决方案1】:

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 脚本包含一些 builtin commandsmysql 客户端处理,但服务器中的 SQL 解析器无法识别。因此,即使 MySQLdb 可以支持多查询,您也不能将任意 .sql 脚本作为输入提供给它。
  • @aleksi 您假设了危险的假设:我认为我不会处理大文件(x100MB +),甚至更小。命令上没有生成器。即使设置命令生成器也很困难,因为您需要 SQL 文件解析器;逐行不一定有效。用分号分割是不好的。等
  • @BerryTsakala:我很难理解你的评论。那就是说;是的,我确实做出了假设,这种方法不适用于每个用例(正如上面的比尔已经很好地指出的那样),但这或多或少正是这个问题所要求的。你说的“危险”是什么意思?与尝试自己解析 SQL 查询不同,这几乎是安全的。是的,这不适用于大文件,你会碰到 MySQL 的最大数据包大小。既然这种方法明确避免,为什么还要谈论解析 SQL?
猜你喜欢
  • 2011-05-23
  • 2011-06-04
  • 2012-02-29
  • 2011-01-24
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多