2009-04-02 36 views

Trả lời

4

Tôi không nghĩ (đúng cho tôi nếu tôi sai) INSERT OR REPLACE là trong bất kỳ các tiêu chuẩn SQL; đó là một điều cụ thể về SQLite. Có MERGE, nhưng điều đó cũng không được hỗ trợ bởi tất cả các phương ngữ. Vì vậy, nó không có sẵn trong phương ngữ chung của SQLAlchemy.

Giải pháp sạch nhất là sử dụng Phiên, theo đề xuất của M. Utku. Bạn cũng có thể sử dụng SAVEPOINTs để lưu, hãy thử: một chèn, ngoại trừ IntegrityError: sau đó rollback và làm một bản cập nhật để thay thế. Một giải pháp thứ ba là viết INSERT của bạn với một mệnh đề OUTER JOIN và WHERE để lọc các hàng có các giá trị rỗng.

6
Session.save_or_update(model) 
+0

Đây không phải là của tôi trường hợp. Tôi không sử dụng phiên, tôi đang sử dụng kết nối trực tiếp, vì vậy nó phải được thực hiện bằng cách sử dụng ngôn ngữ biểu thức SQL và conn.execute (...) – honzas

+2

Dù sao, đây là 0,4 SQLA cụ thể, cho 0,5 bạn phải sử dụng Session.add (mô hình) – Jiri

8

Còn khoảng Session.merge thì sao?

Session.merge(instance, load=True, **kw) 

Sao chép trạng thái của trường hợp sang thể hiện liên tục bằng cùng số nhận dạng.

Nếu không có trường hợp liên tục hiện được liên kết với phiên, nó sẽ được tải. Trả về cá thể kiên trì. Nếu cá thể đã cho chưa được lưu, hãy lưu một bản sao và trả về nó như là một cá thể mới tồn tại. Ví dụ đã cho không được kết hợp với phiên. Thao tác này xếp vào các trường hợp liên quan nếu liên kết được ánh xạ với cascade = "merge".

từ http://www.sqlalchemy.org/docs/reference/orm/sessions.html

1

Bạn có thể sử dụng OR REPLACE như một cái gọi là prefix trong SQLAlchemy bạn Insert - tài liệu về cách đặt OR REPLACE giữa INSERTINTO trong câu lệnh SQL của bạn là here

+0

Điều này tương tự như [câu trả lời này] (http://stackoverflow.com/questions/2218304/sqlalchemy-insert-ignore/2224729#2224729). –

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