2009-04-02 3 views

답변

4

나는 (내가 틀렸다면 정정 해줘) 생각하지 않는다 삽입하거나 SQL 표준의에 교체; 그것은 SQLite에 특정한 것입니다. MERGE가 있지만 모든 방언 중 하나에서 지원되지는 않습니다. 따라서 SQLAlchemy의 일반적인 사투리에서는 사용할 수 없습니다.

M. Utku의 제안처럼 가장 깨끗한 해결책은 세션을 사용하는 것입니다. 또한 SAVEPOINT를 사용하여 SAVEPOINT를 사용하여 다음을 시도해보십시오. IntegrityError를 제외한 삽입을 시도한 다음 롤백하고 대신 업데이트를 수행하십시오. 세 번째 해결 방법은 NULL로 행을 필터링하는 OUTER JOIN 및 WHERE 절을 사용하여 INSERT를 작성하는 것입니다.

6
Session.save_or_update(model) 
+0

이가 아닌 내 케이스. 나는 세션을 사용하지 않는다. Connection을 직접 사용하기 때문에 SQL 표현식 언어와 conn.execute (...)를 사용하여 완료해야한다. ... – honzas

+2

어쨌든 이것은 0.4 SQLA에 고유하며, 0.5는 Session.add를 사용해야한다. (모델) – Jiri

8

Session.merge?

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

동일한 식별자를 사용하여 인스턴스를 인스턴스로 복사합니다.

현재 세션과 연결된 영구 인스턴스가 없으면로드됩니다. 지속 인스턴스를 돌려줍니다. 지정된 인스턴스가 저장되지 않은 경우 복사본을 저장하고 새로 영구 인스턴스로 반환하십시오. 주어진 인스턴스는 세션과 연관되지 않습니다. 이 작업은 연관이 cascade = "merge"로 매핑되는 경우 연관된 인스턴스에 계단식으로 연결됩니다. http://www.sqlalchemy.org/docs/reference/orm/sessions.html

1

에서

당신은 당신의 SQLAlchemy의 Insertprefix 소위로 OR REPLACE 사용할 수 있습니다 - 당신의 SQL 문에 INSERTINTO 사이 OR REPLACE을 배치하는 방법에 대한 문서는 here

+0

이것은 [이 답변] (http://stackoverflow.com/questions/2218304/sqlalchemy-insert-ignore/2224729#2224729)과 유사합니다. –

관련 문제