Трябва да започнете нова транзакция преди .drop_all()
повикване; MySQL ви вижда да четете от таблицата в тази транзакция и заключва таблицата срещу изпускане:
session.commit()
Base.metadata.drop_all()
Извършването на транзакция имплицитно започва нова транзакция.
MySQL гарантира изолация на транзакциите; вашата транзакция ще чете последователни данни и няма да вижда промени, извършени от други транзакции, докато не започнете нова транзакция. A DROP TABLE
изявлението обаче прави невъзможно MySQL да запази тези гаранции, така че таблицата се заключва.
Като алтернатива можете да промените нивото на изолация на транзакциите, като кажете на MySQL, че не ви пука за гаранциите за изолация. Тъй като сесийните връзки се обединяват, това може да се направи само за всички връзки или за никакви; използвайте isolation_level
аргумент за create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Вижте SET TRANSACTION
документация
за подробности относно всяко ниво на изолация.