Thử thêm một
app.teardown_request(Exception=None)
Trình trang trí, thực thi ở cuối mỗi yêu cầu. Tôi hiện đang gặp sự cố tương tự và có vẻ như hôm nay tôi đã thực sự giải quyết được vấn đề đó bằng cách sử dụng.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Tôi không sử dụng Flask-SQLAlchemy
Chỉ SQLAlchemy
thô , vì vậy nó có thể có sự khác biệt cho bạn.
Từ Tài liệu
Trong trường hợp của tôi, tôi mở một scoped_session
mới cho mỗi yêu cầu, yêu cầu tôi xóa nó ở cuối mỗi yêu cầu (Flask-SQLAlchemy
có thể không cần cái này). Ngoài ra, hàm teardown_request được chuyển một Exception
nếu một cái xảy ra trong ngữ cảnh. Trong trường hợp này, nếu một ngoại lệ xảy ra (có thể khiến giao dịch không bị xóa hoặc cần khôi phục), chúng tôi sẽ kiểm tra xem có ngoại lệ nào không và khôi phục.
Nếu điều này không hoạt động đối với thử nghiệm của riêng tôi, điều tiếp theo tôi sẽ làm là session.commit()
ở mỗi giọt nước, chỉ để đảm bảo mọi thứ đều tuôn ra
CẬP NHẬT:nó cũng xuất hiện MySQL làm mất hiệu lực kết nối sau 8 giờ, khiến Phiên bị hỏng.
đặt pool_recycle=3600
trên cấu hình công cụ của bạn hoặc cài đặt