【问题标题】:PyMySQL unable to execute multiple queriesPyMySQL 无法执行多个查询
【发布时间】:2020-02-20 23:41:12
【问题描述】:

使用最新版本的 PyMySQL(0.9.3) 我无法执行包含多个 SQL 语句的查询字符串,用分号 (;) 分隔

我的python版本是:Python 3.6.5

import pymysql # version 0.9.3
conn = {
    "host": "mysql_server_hostname",
    "password": "my_password",
    "port": <<port_no>>,
    "user": "my_username"
}

my_query_str = 'show databases;use random_existing_db;'
with pymysql.connect(**conn):
    cur.execute(query)

返回错误:(1064,'在单个查询中检测到多个语句)

尝试使用 PyMySQL-0.7.11 运行相同的查询,它可以工作

【问题讨论】:

    标签: python python-3.x pymysql


    【解决方案1】:

    在 pymysql 0.8 及以后的版本中,默认情况下不再设置客户端标志。要执行多个语句,需要通过 client_flag=CLIENT.MULTI_STATEMENTS。

    参考:https://github.com/PyMySQL/PyMySQL/blob/v0.9.3/CHANGELOG#L66

    以下修复示例。

    import pymysql
    from pymysql.constants import CLIENT
    
    conn = {
        "host": "mysql_server_hostname",
        "password": "my_password",
        "port": <<port_no>>,
        "user": "my_username",
        "client_flag": CLIENT.MULTI_STATEMENTS
    }
    
    my_query_str = 'show databases;use random_existing_db;'
    with pymysql.connect(**conn) as cur:
        cur.execute(my_query_str)
    

    【讨论】:

    • 这是一个很好的答案,但下一个合乎逻辑的问题是如何获取每个查询返回的数据?答案是。要从复合查询中的第一个查询中获取结果,请执行results_of_statement_1 = cur.fetchall(),对于后续查询,首先检查它们是否为cur.nextset() == True 的待处理结果。一旦这是True,您就可以获得results_of_statement_n = cur.fetchall() 设置的结果。 cur.nextset() 将是 None 当它们没有更多的结果要获取时。
    • 我似乎找不到太多关于此的文档。有谁知道使用 client_flag=CLIENT.MULTI_STATEMENTS 的后果是什么?
    • @PhilipPlachta 你能澄清一下你在说什么类型的后果吗?
    • @RamShankarKumar 也许这是一个愚蠢的问题,但我想知道使用该选项是否有任何缺点。我最终只在需要时才传递该选项 b/c 我找不到太多关于它的信息。
    【解决方案2】:

    没错,我是用client_flag = CLIENT.MULTI_STATEMENTS参数生效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2020-11-16
      • 2019-01-02
      • 1970-01-01
      • 2016-03-11
      • 2020-09-17
      • 2021-09-22
      相关资源
      最近更新 更多