【问题标题】:How do you change the SQL isolation level from Python using MySQLdb?如何使用 MySQLdb 从 Python 更改 SQL 隔离级别?
【发布时间】:2020-12-08 16:45:35
【问题描述】:

我在研究这方面遇到的文档表明,对其他数据库执行此操作的方法是在您的查询中使用多个语句,例如:

>>> cursor = connection.cursor()
>>> cursor.execute("set session transaction isolation level read uncommitted; 
                    select stuff from table; 
                    set session transaction isolation level repeatable read;")

不幸的是,这样做不会产生任何结果,因为显然 Python DB API(或者可能只是它的这个实现?)不支持单个查询中的多个记录集。

过去有没有其他人在这方面取得过成功?

【问题讨论】:

    标签: python mysql isolation-level python-db-api


    【解决方案1】:

    我认为这不适用于 MySQLdb 驱动程序;您必须发出单独的查询:

    cur = conn.cursor()
    cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
    cur.execute("SELECT @@session.tx_isolation")
    print cur.fetchall()[0]
    cur.execute("SELECT * FROM bar")
    print cur.fetchall()
    cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ")
    cur.execute("SELECT @@session.tx_isolation")
    print cur.fetchall()[0]
    
    # output
    ('READ-UNCOMMITTED',)
    (('foo',), ('bar',))
    ('REPEATABLE-READ',)
    

    MySQLdb 游标的 execute() 方法只看到第一个查询到分号:

    cur.execute("SELECT * FROM bar WHERE thing = 'bar'; SELECT * FROM bar")
    print cur.fetchall()
    
    # output
    (('bar',),)
    

    【讨论】:

    • 这正是我所需要的。很奇怪,我以为我以前曾尝试过,但显然我的信号在某个地方被越过了。感谢您的帮助!
    • 对于 MySQL 8.0,应该是cur.execute("SELECT @@session.transaction_isolation")
    【解决方案2】:
    cur.executemany("SELECT * FROM bar WHERE thing = 'bar'; SELECT * FROM bar")
    print cur.fetchall()
    

    使用cur.executemany 运行多个sql 语句;分开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      相关资源
      最近更新 更多