Sie müssen vor .drop_all()
eine neue Transaktion starten Anruf; MySQL sieht, dass Sie in dieser Transaktion aus der Tabelle lesen, und sperrt die Tabelle gegen das Löschen:
session.commit()
Base.metadata.drop_all()
Das Festschreiben einer Transaktion beginnt implizit eine neue Transaktion.
MySQL garantiert die Transaktionsisolation; Ihre Transaktion liest konsistente Daten und sieht keine Änderungen, die von anderen Transaktionen übernommen wurden, bis Sie eine neue Transaktion starten. Eine DROP TABLE
-Anweisung macht es MySQL jedoch unmöglich, diese Garantien einzuhalten, sodass die Tabelle gesperrt wird.
Alternativ könnten Sie die Transaktionsisolationsstufe ändern und MySQL mitteilen, dass Ihnen die Isolationsgarantien egal sind. Da Sitzungsverbindungen gepoolt werden, kann dies nur für alle Verbindungen oder gar keine erfolgen; Verwenden Sie die isolation_level
Argument für create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Siehe SET TRANSACTION
Dokumentation
für Details zu jeder Isolationsstufe.