Cách hoạt động của tính năng autocommit của SQLAlchemy là nó kiểm tra các câu lệnh đã phát hành, cố gắng phát hiện xem dữ liệu có bị sửa đổi hay không:
..., SQLAlchemy triển khai tính năng "autocommit" của riêng mình, tính năng này hoạt động hoàn toàn nhất quán trên tất cả các phần mềm phụ trợ. Điều này đạt được bằng cách phát hiện các câu lệnh đại diện cho các hoạt động thay đổi dữ liệu, tức là CHÈN, CẬP NHẬT, XÓA, cũng như các câu lệnh ngôn ngữ định nghĩa dữ liệu (DDL) như TẠO BẢNG, BẢNG BÁO, sau đó đưa ra một CAM KẾT tự động nếu không có giao dịch nào đang diễn ra . Việc phát hiện dựa trên sự hiện diện của
autocommit=True
tùy chọn thực thi trên câu lệnh. Nếu câu lệnh là câu lệnh chỉ văn bản và cờ không được đặt, một biểu thức chính quy được sử dụng để phát hiện INSERT, UPDATE, DELETE, cũng như nhiều lệnh khác cho một chương trình phụ trợ cụ thể
Vì nhiều bộ kết quả không được hỗ trợ ở cấp SQLAlchemy, trong ví dụ đầu tiên của bạn, việc phát hiện chỉ đơn giản là bỏ qua việc phát hành COMMIT vì đầu tiên là một câu lệnh CHỌN, trong đó như trong ví dụ thứ hai của bạn, nó là một CẬP NHẬT. Không có nỗ lực nào để phát hiện ra các câu lệnh sửa đổi dữ liệu từ nhiều câu lệnh.
Nếu bạn nhìn vào PGExecutionContext.should_autocommit_text()
, bạn sẽ thấy rằng nó đối sánh regex với AUTOCOMMIT_REGEXP
. Nói cách khác, nó chỉ khớp ở đầu văn bản.