2013-02-02 32 views
8

Điều gì là chính xác? Tôi biết đầu tiên sẽ làm việc nhưng tôi nghi ngờ nó làm việc nhiều hơn cho DB hơn là có thể cần thiết. Liệu công việc thứ hai cũng sẽ tốt hơn nhưng với ít công việc hơn cho DB? Tôi đang sử dụng MySQL FWIW.Khi nào tôi nên cam kết với SQLAlchemy bằng cách sử dụng vòng lặp for?

for item in items: 
    db.session.add(item) 
    db.session.commit() 

hoặc

for item in items: 
    db.session.add(item) 
db.session.commit() 
+1

Bạn đang thực hiện bao nhiêu thao tác? Họ có tài nguyên chuyên sâu không? Trừ khi có bất kỳ lý do nào bạn không muốn cam kết sau mỗi lần, tôi không hiểu tại sao bạn không muốn luôn sử dụng # 1. – woemler

Trả lời

4

Tôi nghĩ rằng giải pháp thứ hai của bạn là tốt hơn nhưng nó phụ thuộc vào cách bạn đã cấu hình phiên của bạn. Cụ thể là các cài đặt autoflush và autocommit. Ngoài ra, bạn nên sử dụng một công cụ có hỗ trợ tốt cho các giao dịch, chẳng hạn như innodb.

Giả sử bạn có chế độ tự động và tự động tắt, sau đó bạn sẽ xóa lệnh chèn vào máy chủ, cam kết giao dịch trước đó và sau đó tạo một giao dịch khác trên mỗi lần lặp lại đang tạo nhiều công việc không cần thiết cả trong SQLAlchemy và MySQL.

Tôi khuyên bạn nên sử dụng add_all nếu bạn có một danh sách các mục đơn giản để thêm như trong ví dụ của bạn, nếu không bạn cần vòng lặp thì chắc chắn áp dụng cam kết bên ngoài vòng lặp.

http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.add_all

db.session.add_all(items) 
db.session.commit() 

Một lưu ý thêm, nếu cái gì đó đã đi sai đường một phần thông qua các vòng lặp giao dịch của bạn sẽ rollback viết chỉ để bạn trước khi cam kết trong vòng lặp mà có lẽ không phải là điều bạn muốn nếu bạn đang sử dụng giao dịch. Ví dụ, chỉ một nửa các mục của bạn trong danh sách có thể được ghi vào cơ sở dữ liệu nếu một lỗi xảy ra một nửa thông qua vòng lặp của bạn. Trong khi đó, gọi cam kết bên ngoài vòng lặp đảm bảo rằng vòng lặp của bạn đã kết thúc và sẽ là TẤT CẢ cam kết hoặc TẤT CẢ được khôi phục.

Các vấn đề liên quan