【问题标题】:Is there a way to execute more than one query per string in MySQL-Python?有没有办法在 MySQL-Python 中对每个字符串执行多个查询?
【发布时间】:2015-09-15 09:08:49
【问题描述】:

我有一些输入,它是一个包含多个 MySQL 查询的字符串,例如 USE some_db; SELECT * FROM some_table;。当我将此字符串存储为srun cursor.execute(s) 时,它会打印出0L,而当我执行cursor.fetchall() 时,它会返回一个空元组。它不会引发任何异常,但它也不起作用。当我将字符串拆分为两个查询并为每个查询打开一个游标并执行时,它可以工作,但是将字符串正确拆分为查询并不容易,尤其是当有 cmets 时。有没有办法避免拆分和执行多个查询的整个字符串?或者这有一个很好的库可以将多个查询的字符串拆分为每个查询一个查询的字符串?

谢谢!

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    查看 MySQLCursor.execute() 的文档。

    它声称您可以传入一个multi 参数,该参数允许您在一个字符串中运行多个查询。

    如果 multi 设置为 True,execute() 可以执行多个 操作字符串中指定的语句。

    multi 是 execute() 调用的可选第二个参数:

    operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
    for result in cursor.execute(operation, multi=True):
    

    【讨论】:

    • 我认为这是 mysql.connector,而不是 mysql-python。
    • 这会将建议更改为“切换到 mysql.connector 而不是 mysql-python”:-)
    【解决方案2】:

    当然,一个 Python 脚本可以从一个字符串或列表、外部 .sql 或 .txt 文件中运行多个 SQL 语句,这些文件可以来自 MySQL。

    但是,cur.execute 命令一次运行一条 SQL 行。因此,您将需要迭代地遍历每个 SQL 行。所以,考虑用分号分割多个 SQL 命令。

    s = "USE some_db; SELECT * FROM some_table;"
    
    # filter() removes trailing empty list item
    s = filter(None, s.split(';'))
    
    for i in s:
        # strip() removes leading and trailing white spaces  
        # semicolon is re-added per line for query run
        cur.execute(i.strip() + ';')
    

    但请务必删除 cmets 中的所有分号。

    # PROCESSING STEP 1;
    # PROCESSING STEP 1
    

    【讨论】:

    • 该代码对于包含分号的常量字符串很危险,并且对于参数化查询(应该是几乎所有查询)来说效果不佳。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2019-01-14
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多