를 새로 고칩니다. 종종 세션에서 Foo 객체를 분리하고 값과 Bar의 값을 계속 사용합니다. 때때로 Foo의 상태 필드를 업데이트해야합니다. 이 경우 새 세션을 만들고 foo 객체를 세션에 추가하고 커밋합니다. 커밋 후에 Foo 객체와 연결된 Bar 객체는 무효화되지만 Foo 객체의 커밋의 암시 적 새로 고침에 의해 다시로드되지 않습니다. Foo 객체를 세션에서 다시 분리하면 Bar 객체는 더 이상 사용할 수 없습니다. 내가 해결할 수있는 유일한 방법은 foo를 커밋 한 후 명시 적으로 막대 객체를로드하는 것입니다.SQLAlchemy의 열망로드
예 워크 플로우는 :
session = Session()
foo = session.query(Foo).get(id) <-- foo.bar is automatically eager loaded
session.close()
....
session = Session()
session.add(foo)
foo.status = 'done'
session.commit() <-- foo is commited and refreshed, foo.bar is not
session.refresh(foo) <-- same here, foo.bar is not loaded
#foo.bar <-- only explicit eager loading foo.bar here works
session.close()
....
foo.bar <-- error if not explicitly eager loaded
나는 객체와 같은 그 작은 바의 몇 가지에 대해이 설정을 사용하고 싶습니다. foo.bar 객체를 항상 명시 적으로 다시로드하는 것을 기억하도록 요청하면 오류가 발생하기 쉽습니다. 그래서 내 질문은 : 쿼리(), 커밋() (암시 적 새로 고침) 또는 (명시 적) 새로 고침() 수 모든 상황에서 foo.bar로드 열망 수 있습니까?
내 특정 설정에서's.commit()'은 foo 객체에서 bar를 사용하지 않고 (내가 직접 attr을 건드린 다) 선택을합니다. 이유가 확실하지 않습니다. 나는 암시 적으로 당신이 지적한대로 암시 적으로 새로 고침을 위해 그것을 취했습니다. 나는 당신의 작은 데모로 이것을 미리 준비 할 수 없다. 열정적 인 로딩은 명백한's.refresh (foo)'로 작동합니다. 나는 그걸 어떻게 든 놓쳤다. 나는 여전히 SQLAlchemy를 많이 배우고 실험하고있다. – dieterg
SQLAlchemy는 "분리 된"상태의 개체를 사용하지 않으려 고합니다. My Foo 객체는 여러 HTTP 요청을 처리하며 요청이 끝나면 항상 orm 세션을 닫습니다. foo 객체를 1/100 만 업데이트하면됩니다. 다른 99 개는 데이터를 사용합니다. 그렇다면 어떤 디자인을 권하고 싶습니까? 1) Foo와 Bar의 데이터를 nonm 객체와 requery에 복사해야합니다. 2) Foo를 업데이트/새로 고침 할 필요가 없더라도 새로운 orm 세션을 엽니 다. 3) ... – dieterg
일반적으로 웹 응용 프로그램은 모든 요청에 필요한 모든 데이터를로드합니다. Foo 객체를 요청 번호 1 번에로드하면 6 시간 후에 요청 번호 2가 나오고 6 시간 동안 메모리에 "Foo"객체를 저장 했습니까? 그들이 최신 정보를 어떻게 알 수 있습니까? 이것은 실제로 캐싱 패턴입니다.SQLAlchemy에서 캐싱을 권장하는 이유는 개체가 각 요청에 대해 새 Session에 다시 첨부되거나 병합된다는 것입니다. [dogpile caching] (http://docs.sqlalchemy.org/en/rel_0_8/orm/examples.html#dogpile-caching) 권장 설계 지침. – zzzeek