Du skal starte en ny transaktion før .drop_all()
opkald; MySQL ser dig læse fra tabellen i denne transaktion og låser tabellen mod at blive droppet:
session.commit()
Base.metadata.drop_all()
Ved at udføre en transaktion starter implicit en ny transaktion.
MySQL giver garantier om transaktionsisolering; din transaktion vil læse ensartede data og vil ikke se ændringer begået af andre transaktioner, før du starter en ny transaktion. En DROP TABLE
statement gør det imidlertid umuligt for MySQL at beholde disse garantier, så bordet bliver låst.
Alternativt kan du ændre transaktionsisolationsniveauet og fortælle MySQL, at du er ligeglad med isolationsgarantierne. Fordi sessionsforbindelser er samlet, kan dette kun gøres for alle forbindelser eller ingen overhovedet; brug isolation_level
argument til create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Se SET TRANSACTION
dokumentation
for detaljer om hvert isolationsniveau.