Novou transakci musíte zahájit před .drop_all()
volání; MySQL v této transakci vidí, že čtete z tabulky, a uzamkne tabulku proti zahození:
session.commit()
Base.metadata.drop_all()
Potvrzení transakce implicitně zahájí novou transakci.
MySQL poskytuje záruky ohledně izolace transakcí; vaše transakce bude číst konzistentní data a neuvidí změny provedené jinými transakcemi, dokud nezačnete novou transakci. DROP TABLE
prohlášení však znemožňuje MySQL zachovat tyto záruky, takže tabulka je uzamčena.
Případně můžete změnit úroveň izolace transakcí a říci MySQL, že vás nezajímají záruky izolace. Protože připojení relací jsou sdružená, lze to provést pouze pro všechna připojení nebo pro žádné; použijte isolation_level
argument pro create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Viz SET TRANSACTION
dokumentaci
podrobnosti o každé úrovni izolace.