Bạn cần bắt đầu một giao dịch mới trước .drop_all()
cuộc gọi; MySQL thấy bạn đang đọc từ bảng trong giao dịch này và khóa bảng khỏi bị rơi:
session.commit()
Base.metadata.drop_all()
Việc cam kết một giao dịch bắt đầu một giao dịch mới.
MySQL đảm bảo về cách ly giao dịch; giao dịch của bạn sẽ đọc dữ liệu nhất quán và sẽ không thấy các thay đổi được cam kết bởi các giao dịch khác cho đến khi bạn bắt đầu một giao dịch mới. DROP TABLE
tuy nhiên, câu lệnh làm cho MySQL không thể giữ các bảo đảm này, do đó bảng đang bị khóa.
Ngoài ra, bạn có thể thay đổi mức cô lập giao dịch, nói với MySQL rằng bạn không quan tâm đến các đảm bảo cô lập. Bởi vì các kết nối phiên được gộp chung, điều này chỉ có thể được thực hiện cho tất cả các kết nối hoặc không kết nối nào cả; sử dụng isolation_level
đối số cho create_engine()
:
engine = create_engine(
'mysql://username:[email protected]/databasename',
isolation_level='READ UNCOMMITTED')
Xem SET TRANSACTION
tài liệu
để biết chi tiết về từng cấp độ cách ly.