Du måste starta en ny transaktion före .drop_all()
ringa upp; MySQL ser att du läser från tabellen i den här transaktionen och låser tabellen mot att släppas:
session.commit()
Base.metadata.drop_all()
Att utföra en transaktion startar implicit en ny transaktion.
MySQL ger garantier om transaktionsisolering; din transaktion kommer att läsa konsekventa data och kommer inte att se ändringar som begåtts av andra transaktioner förrän du startar en ny transaktion. En DROP TABLE
statement gör det dock omöjligt för MySQL att behålla dessa garantier så att bordet låses.
Alternativt kan du ändra transaktionsisoleringsnivån och berätta för MySQL att du inte bryr dig om isoleringsgarantierna. Eftersom sessionsanslutningar är poolade, kan detta endast göras för alla anslutningar eller inga alls; använd isolation_level
argument till create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Se SET TRANSACTION
dokumentation
för detaljer om varje isoleringsnivå.