2013-04-03 2 views
0

필자는 모델 클래스와 실질적으로 동등한 데이터베이스를 가지고있어 시간을 낭비하는 것처럼 보입니다. 나는 SQLAlchemy의 코어 (안 ORM)를 사용하고, 나는 게이트웨이의 예처럼 보일 클래스 생성 : 상태에 잡고 사용하여 저장하려면 "금지"또는 "포럼"클래스를 만들기특정 db 테이블을 나타 내기 위해 항상 모델이 필요합니까?

class BanGate(Gateway): 

    def __init__(self): 
      super(BanGate, self).__init__('ban') 

    def ban_user(self, user, group, exp): 
      data = dict(user_id=user, group_id=group, expires=exp) 
      self._table.insert(values=data).execute() 

    def unban_user(self, user, group): 
      cond = and_(self._table.c.user_id == user, self._table.c.group_id == group) 
      self._table.delete(whereclause=cond).execute() 

class ForumGate(Gateway): 

    def __init__(self): 
      super(ForumGate, self).__init__('forum') 

    def create_forum(self, group, user, title, desc): 
      data = dict(group_id=group, creator=user, name=title, description=desc) 
      self._table.insert(values=data).execute() 

    def delete_forum(self, forum): 
      stmt = (self._table.c.forum_id == forum) 
      self._table.delete(whereclause=stmt).execute() 

을 이 게이트웨이는 시간 낭비처럼 보입니다. 컨트롤러의 경우 요청 객체의 데이터를 가져 와서이 게이트웨이 객체를 직접 사용하는 방법에 대해 생각하고 있습니다. 페이지에 대한 대부분의 데이터는 조작되거나 저장되거나 읽혀질 필요가 없으므로 모델 클래스의 사용은 필요하지 않은 것처럼 보입니다.

또한 게이트웨이 내부에서 사용되는 테이블 클래스는 자동로드 기능을 사용하므로 데이터베이스 스키마를 정의하지 않았습니다.

그래서 기본적으로 데이터를 지속하려면 어떻게해야합니까? 이러한 게이트웨이 개체로 전달되는 모델 클래스를 만들어야합니까? 아니면 단순히 게이트웨이 개체 데이터를 요청 개체에서 직접 전달해야합니까?

(또한, "gatway"나는 http://martinfowler.com/eaaCatalog/tableDataGateway.html 참조 시까 지)이 경우에 잘

+1

아니요. 실제로 모델은 하나의 인스턴스이고 레이어가 아닙니다. 컨트롤러, 뷰 및 다른 것들을 포함하는 MVC 디자인 패턴의 다른 주요 레이어 (프리젠 테이션 레이어)처럼. 당신이 "모델"이라고 부르는 것은 실제로 [도메인 객체] (http://c2.com/cgi/wiki?DomainObject)입니다. 그리고 그것들은 단일 DB 구조에 묶여서는 안됩니다. 지옥, 그들은 DB가 나가는 것을조차 인식하지 않아야합니다. –

답변

2

, 당신은 모든 삽입 코드를 손으로 필요에 의해 ORM을 개혁하고()/업데이트() 등 구축 이는 단지 거기에있는 지속성 및 쿼리 기능을 사용하는 것보다 훨씬 많은 작업입니다. "시간 낭비"에 코드에 정의 된 클래스가있는 경우 반사를 사용하려는 경우 SQLSoup 같은 도구를 사용하거나 비슷한 항목을 굴려야합니다 (예 : DeferredReflection). 모든 ORM 구성에서 type()을 사용하여 Python 클래스를 즉시 만들 수 있으므로 ORM을 동적으로 활용할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다! 실제로 리플렉션을 사용하고 있습니다. 부모 클래스 인 '게이트웨이'는 둘 다 상속되며 인수로 테이블 이름을 사용하고 리플렉션을 사용하여 테이블의 스키마를로드합니다. orm을 사용하고 싶지 않은 사람들을 위해 sqlalchemy 핵심 구성 요소가 있다고 생각했습니다. 나는 쿼리를 직접 만들고 자신이 무엇을하고 있는지 정확히 알기를 좋아합니다. 이것이 mvc 방식으로 sqlalchemy 핵심 구성 요소를 사용하는 좋은 방법이 아니라면 좋은 예를 들어 주시겠습니까? 감사합니다 – Jaigus

+0

코어는이 유즈 케이스를 위해 설계되었습니다. 맞습니다. 그러나 실제로 레코드를 만들고 DB에서 저장 /로드하려는 경우 ORM은 여전히이를 얻을 수있는 빠른 방법입니다. 코어는 응용 프로그램이 지속성 (즉, reddit)을 수행하는 방법에 근본적으로 다른 접근법을 사용하는 경우 1. 성능에 대한 이유로 특정 방식으로 매우 특정한 SQL을 내보내려는 경우 3. 사용자는 더 큰 "지속성"패턴 (데이터 마이그레이션과 같은)에 속하지 않는 임시 SQL을 방출 4. CRUD/반복이 많지 않은 기존 데이터베이스의 SQL 중심보기 – zzzeek

+0

이해 ... 내 ORM을 사용하지 않은 주된 이유는 쿼리를 완벽하게 제어하고 싶었고 나를 생성하는 시스템 아이디어가 마음에 들지 않았기 때문입니다. 또한 ORM에 구현 된 데이터 - 맵퍼 패턴은이 프로젝트에서 과도한 것처럼 보이고, 위와 같은 가벼운 게이트웨이 패턴을 사용하는 것이 더 좋을 것이라고 생각했습니다 (그 점에 대해 어떻게 생각하십니까?). 나는 너의 대답을 읽은 후에 ORM을 사용하여 다시 살펴보고 다시 생각할 것이다. 그러나이 게이트웨이 접근 방식을 사용하면 결국 요청 개체에서 직접 게이트웨이로 데이터를 전달하는 것에 대해 어떻게 생각하십니까? – Jaigus

관련 문제