Tôi đang sử dụng SQLAlchemy với phần phụ trợ Postgres để thực hiện chèn hoặc cập nhật hàng loạt. Để cố gắng cải thiện hiệu suất, tôi đang cố gắng cam kết chỉ một lần mỗi nghìn hàng hoặc như vậy:Làm cách nào để thực hiện chèn hoặc cập nhật hàng loạt với SQLAlchemy hiệu quả?
trans = engine.begin()
for i, rec in enumerate(records):
if i % 1000 == 0:
trans.commit()
trans = engine.begin()
try:
inserter.execute(...)
except sa.exceptions.SQLError:
my_table.update(...).execute()
trans.commit()
Tuy nhiên, điều này không hoạt động. Có vẻ như khi INSERT không thành công, nó để lại mọi thứ trong một trạng thái kỳ lạ ngăn cản việc cập nhật xảy ra. Nó có tự động quay trở lại giao dịch không? Nếu vậy, điều này có thể được dừng lại? Tôi không muốn toàn bộ giao dịch của mình được khôi phục trong trường hợp có vấn đề, đó là lý do tại sao tôi đang cố gắng nắm bắt ngoại lệ ngay từ đầu.
Thông báo lỗi tôi nhận được, BTW, là "sqlalchemy.exc.InternalError: (InternalError) giao dịch hiện tại bị hủy bỏ, lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch", và nó xảy ra trên bản cập nhật().) gọi điện.
"Nếu xảy ra lỗi trong giao dịch, nó sẽ buộc toàn bộ giao dịch được khôi phục. Tôi xem đây là lỗi thiết kế Postgres". - Đây không phải là điểm giao dịch sao? Từ [Wikipedia] (http: //en.wikipedia.org/wiki/Database_transaction): "Giao dịch cung cấp đề xuất 'tất cả hoặc không có gì', cho biết mỗi đơn vị công việc được thực hiện trong cơ sở dữ liệu phải hoàn thành toàn bộ hoặc không có tác dụng." – spiffytech
@Spiffytech Phản hồi tốt. Điều này thực sự làm tôi LOL. –