2010-04-09 4 views
2

session 개체를 SQLAlchemy와 함께 사용하는 방법과 매핑 된 개체의 단위 테스트를 구성하는 방법에 대한 지침이 필요합니다. 내가 할 수 싶은 것이SQLAlchemy : 누가 "세션"을 담당합니까? (그리고 세션으로 단위 테스트하는 방법)

는 다음과 같이이다 : 이것을 달성하기 위해

thing = BigThing() # mapped object 
child = thing.new_child() # create and return a related object 
thing.save() # will also save the child object 

, 나는 BigThing 실제로 자신을 추가 (그리고 어린이) 데이터베이스에있는의 생각 - 하지만 어쩌면 이것은 좋은 생각이 아닐까요? 가능한 한 빨리 개체를 추가 할 수

이유 중 하나는 데이터베이스에 의해 할당 된 자동 id 값입니다 - 빨리가 가능하며, 적은 문제가

가장 좋은 방법으로는 무엇입니까 (? 오른쪽)이 있습니다 session 개체를 관리 하시겠습니까? 누가 session을 담당합니까?
필요한 경우에만 생성해야합니까? 아니면 오랫동안 구 했나요?

매핑 된 개체에 대한 단위 테스트는 어떻게됩니까? ... session은 어떻게 처리해야합니까? 매핑 된 객체를 자동으로 데이터베이스에 추가하는 것만으로도 괜찮습니까? 아니면 문제가 될 것인가?

답변

2

세션은 개체를 저장하는 상자와 같습니다. 물론 __init__ 메소드를 작성하여 자동으로 객체를 추가 할 수는 있지만 이는 일부 글로벌 (유일하게) 세션이 있음을 의미합니다. 물론 이것이 많은 경우에 문제를 일으킬 것이지만, 이것은 또한 코드 작성을 단순화 할 것입니다. 그것은 명시 적 대 암묵적 딜레마입니다. 일부 사람들은 Zen of Python을 따르고 일부는 Python을 따르지 만 일부는 Python을 따르지 않습니다. 명시 적으로 저장하는 상자를 지정하는 것을 선호합니다.

관계를 통해 세션에 이미있는 개체와 연관되어있는 한 명시 적으로 세션에 자식을 추가 할 필요가 없습니다. 그것은 cascading rules을위한 것입니다. 기본값 인 'save-update'은 사용자가 요청한 것과 정확히 일치합니다. 'all, delete-orphan'에 관심이있어 부모와 함께 삭제해야하는 "개인"개체를 구현할 수도 있습니다.

save() 방법을 구현하는 데 몇 가지 문제점이 있습니다. 현재 버전의 SQLAlchemy에서 "이 객체 저장"을 말할 방법이 없습니다. 그런 능력이 일찍 있었지만 결코 신뢰할 수 없었습니다. Session.flush() (Session.commit()에서 호출 됨) 모두 변경 사항을 데이터베이스로 플러시합니다. 이것은 아마도 SQLAlchemy에서 가장 귀찮은 기능으로 특정 프로젝트에서이 기능을 사용할 수 없게됩니다.

단위 테스트는 (적어도 세션을 명시 적으로 지정할 때) 매우 쉽습니다 (see the sample code in other question).

+0

좋아, 나는 이해할 수있다 : "객체 박스"... 그래서 나는 모든 객체가 데이터베이스에 커밋되는 한 번에 작업하는 모든 관련 객체들을위한 컨테이너와 같다. 함께. 유닛 테스팅에서는 테스트 당 하나의 세션이 있어야한다고 생각합니다. 웹 서버의 경우 요청 당 하나의 세션 (?). 그리고 데스크톱 응용 프로그램의 경우 ... 앱 수명 동안 단 하나의 세션 만있을 수 있습니까? 아니면 수행되는 모든 "작업"에 대해 새로운 세션이 있어야합니까? 완료하고 다시 사용할 때 "상자를 비우십시오"할 수 있습니까? –

+0

전체 데스크톱 응용 프로그램에 대해 단일 세션을 사용할 수 있으며 각 작업마다 별도로 사용할 수 있습니다. 나중에는 다소 느리지 만 더 안정적입니다. 세션을 지우는'expunge_all()'메쏘드가 있습니다. –

관련 문제