Как изменить уровень изоляции SQL от Python с помощью MySQLdb?

Документация, с которой я столкнулся, исследуя это, указывает, что способ сделать это для других баз данных - использовать несколько операторов в вашем запросе, а-ля:

>>> 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 (или, может быть, только эта его реализация?) не поддерживает несколько наборов записей в одном запросе.

Кто-нибудь еще имел успех с этим в прошлом?


person jodonnell    schedule 15.04.2011    source источник


Ответы (2)


Я не думаю, что это работает для драйвера 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',)

Метод execute() курсора MySQLdb видит только первый запрос до точки с запятой:

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

# output
(('bar',),)
person samplebias    schedule 16.04.2011
comment
Это именно то, что мне было нужно. Странно, я думал, что пробовал это раньше, но, видимо, мои сигналы где-то пересеклись. Спасибо за вашу помощь! - person jodonnell; 16.04.2011
comment
Для MySQL 8.0 это должно быть cur.execute("SELECT @@session.transaction_isolation"). - person Rockallite; 02.04.2021

cur.executemany("SELECT * FROM bar WHERE thing = 'bar'; SELECT * FROM bar")
print cur.fetchall()

используйте cur.executemany для запуска нескольких операторов sql с помощью ; разделены.

person BalaramPradhan    schedule 08.12.2020