Musisz rozpocząć nową transakcję przed .drop_all()
połączenie; MySQL widzi, że czytasz z tabeli w tej transakcji i blokuje tabelę przed porzuceniem:
session.commit()
Base.metadata.drop_all()
Zatwierdzenie transakcji niejawnie rozpoczyna nową transakcję.
MySQL daje gwarancje dotyczące izolacji transakcji; Twoja transakcja odczyta spójne dane i nie zobaczy zmian wprowadzonych przez inne transakcje, dopóki nie rozpoczniesz nowej transakcji. DROP TABLE
oświadczenie uniemożliwia jednak MySQL zachowanie tych gwarancji, więc tabela jest zablokowana.
Alternatywnie możesz zmienić poziom izolacji transakcji, informując MySQL, że nie dbasz o gwarancje izolacji. Ponieważ połączenia sesji są gromadzone, można to zrobić tylko dla wszystkich połączeń lub wcale; użyj isolation_level
argument do create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Zobacz SET TRANSACTION
dokumentacja
aby uzyskać szczegółowe informacje na temat każdego poziomu izolacji.