Vous devez commencer une nouvelle transaction avant le .drop_all()
appel; MySQL vous voit lire à partir de la table dans cette transaction et verrouille la table contre sa suppression :
session.commit()
Base.metadata.drop_all()
La validation d'une transaction commence implicitement une nouvelle transaction.
MySQL offre des garanties sur l'isolation des transactions ; votre transaction lira des données cohérentes et ne verra pas les modifications validées par d'autres transactions jusqu'à ce que vous commenciez une nouvelle transaction. Un DROP TABLE
Cependant, il est impossible pour MySQL de conserver ces garanties, de sorte que la table est verrouillée.
Alternativement, vous pouvez modifier le niveau d'isolation des transactions, indiquant à MySQL que vous ne vous souciez pas des garanties d'isolation. Étant donné que les connexions de session sont regroupées, cela ne peut être fait que pour toutes les connexions ou aucune ; utilisez le isolation_level
argument de create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Voir le SET TRANSACTION
documents
pour plus de détails sur chaque niveau d'isolement.