2013-01-31 3 views
18

orm을 사용하여 SQLAlchemy에서 모델 인스턴스 (행)를 복제하려고합니다. 내 첫번째 생각은이 작업을 수행하는 것이 었습니다 :SQLAlchemy : 분리 객체 수정

i = session.query(Model) 
session.expunge(i) 

old_id = i.id 
i.id = None 
session.add(i) 
session.flush() 
print i.id #New ID 

그러나, 분명히 분리 된 객체가 여전히이 분리 동안 내가 없음으로 ID를 설정에도 불구하고, 한 무슨 ID가 "기억". 따라서 session.flush()는 기본 키를 null로 변경하는 UPDATE를 실행하려고 시도합니다.

이 예상되는 동작입니까? 이 속성의 '메모리'를 제거하고 분리 된 객체를 세션에 다시 추가 할 때 새로운 객체로 취급하는 방법은 무엇입니까? 일반적으로 SQLAlchemy 모델 인스턴스를 복제하는 방법은 무엇입니까?

답변

34

이 경우는 make_transient() 도우미 함수를 사용하여 볼 수 있습니다 :

inst = session.query(Model).first() 
session.expunge(inst) 

make_transient(inst) 
inst.id = None 
session.add(inst) 
session.flush() 
print inst.id #New ID 
+0

감사합니다, 워드 프로세서에서 볼하지 않았다. –

+4

@zzzeek뿐만 아니라 관계를 복사하는 적절한 방법은 무엇입니까? – jmagnusson

+0

나는 비슷한 것에도 관심이있다. 엔티티 (행)를 모든 하위 엔티티 (이 행을 가리키는 외래 키가있는 다른 테이블의 행)와 함께 복제하고이 새 중복 행과 그 중복 하위를 새 상위 엔티티에 연결하는 데 관심이 있습니다. 새로운 중복 행에서 다른 외래 키를 통해 (그러나 기존 엔티티와 하위 엔티티에는 영향을 미치지 않음). 나는 SO에 대한 다른 질문에 대한이 부분적인 대답을 볼 수있다 : http://stackoverflow.com/questions/20112850/sqlalchemy-clone-table-row-with-relations?lq=1 – Soferio

1
def duplicate(self): 
    arguments = dict() 
    for name, column in self.__mapper__.columns.items(): 
     if not (column.primary_key or column.unique): 
      arguments[name] = getattr(self, name) 
    return self.__class__(**arguments) 
+0

만약 당신의 객체가'보류 중 '이라면, 이것은 그렇지 않다. 어떤 관계도. 나는. 외래 키 열은 아직 채워지지 않습니다. – gromgull

+0

또한 메소드 및 하이브리드 속성을 복사하지 않습니다. – Jakobovski