2010-03-17 2 views
0

프로그래밍에 익숙하지 않고 Pylons 설명서에서 위키 만들기에 대한 예를 따르면서입니다. 위키에 연결하려는 데이터베이스는 Elixir로 작성되었으므로 위키 데이터베이스 스키마를 다시 작성하고 거기에서 계속했습니다.Elixir와 Pylons에서 다형성 상속으로 자체 관계를 만드는 방법은 무엇입니까?

위키에는 페이지 및 섹션에 상속되는 requirement for a Navigation table이 있습니다. 섹션에는 페이지가 여러 개있을 수 있지만 페이지에는 섹션이 하나만있을 수 있습니다. 또한 각 형제 노드는 서로 체인 참조 될 수 있습니다.

그래서 :

  • 탐색은 "전에" "섹션"(OneToMany)와이 -
  • 페이지 "섹션"(ManyToOne - 한 부분에서 많은 페이지)가 (OneToOne을 선행 노드를 참조) 및

    :
  • 섹션이 탐색에서 모든이 같은

코드 내가 쓴 모습을 상속 "전에"상속 36,936,897,352,053,210

오류가 이것을 수신 :

sqlalchemy.exc.OperationalError (OperationalError) 테이블 탐색은 탐색 (이름, 경로 aftr_id, ROW_TYPE) VALUES (내로 u'INSERT aftr_id라는 어떠한 열이 없다?? ?도하지

탐색에
before = ManyToMany('Nav', inverse='before') 

희망이 문제를 깰 수도 있지만 :) '

나는 또한 시도했습니다.

nav_table = schema.Table('nav', meta.metadata, 
    schema.Column('id', types.Integer(), 
     schema.Sequence('nav_id_seq', optional=True), primary_key=True), 
    schema.Column('name', types.Unicode(255), default=u'Untitled Node'), 
    schema.Column('path', types.Unicode(255), default=u''), 
    schema.Column('section', types.Integer(), schema.ForeignKey('nav.id')), 
    schema.Column('before', types.Integer(), default=None), 
    schema.Column('type', types.String(30), nullable=False) 
) 

page_table = schema.Table('page', meta.metadata, 
    schema.Column('id', types.Integer, schema.ForeignKey('nav.id'), primary_key=True), 
    schema.Column('content', types.Text(), nullable=False), 
    schema.Column('posted', types.DateTime(), default=now), 
    schema.Column('title', types.Unicode(255), default=u'Untitled Page'), 
    schema.Column('heading', types.Unicode(255)), 
) 

section_table = sa.Table('section', meta.metadata, 
    schema.Column('id', types.Integer, 
     schema.ForeignKey('nav.id'), primary_key=True), 
) 

orm.mapper(Nav, nav_table, polymorphic_on=nav_table.c.type, polymorphic_identity='nav') 
orm.mapper(Section, section_table, inherits=Nav, polymorphic_identity='section') 
orm.mapper(Page, page_table, inherits=Nav, polymorphic_identity='page', properties={ 
    'comments':orm.relation(Comment, backref='page', cascade='all'), 
    'tags':orm.relation(Tag, secondary=pagetag_table) 
}) 

어떤 도움이 많이 감사합니다 다음과 같이

이 선언에 대한 튜토리얼 원래 SQLAlchemy의 코드입니다.

답변

0

귀하의 모델이 대부분 정확하다고 생각합니다. 내가 찾은있는 유일한 방법은 다시 Nav-> 페이지에서 링크 section하고 있습니다 :

class Nav(Entity): 
    section = OneToMany('Page', inverse='section') 
class Page(Nav): 
    section = ManyToOne('Nav', inverse='section') 

대신 가지고 있어야 parent (클래스 Nav), 있도록 Section (안 Page)이 단지 것을 튜토리얼 :

기본적으로
class Nav(Entity): 
    section = ManyToOne('Section') 
# and optionally inverse 
class Section(Nav): 
    children = ManyToOne('Nav') 

는 모델을 명확하게 PageFile 같이하는 DirectorySection을 볼 수 있습니다. 둘 다 a (parent) section이고 어떤 식 으로든 정렬되었다고 가정하면 before 참조도 있습니다.

beforeafter 부분이 내게 맞습니다. 따라서 남은 유일한 것은 데이터베이스 스키마가 객체 모델을 반영하지 않는다는 것입니다. db 모델을 다시 만들 수 있습니까? 또는 최소한 결과 db 스크립트를 게시 하시겠습니까?

+0

"before"및 "after"구성 요소에 여전히 문제가있는 것 같습니다. 내가 Nav에서 한 것은 단순히 "섹션"과 "이전"에 대한 ManyToMany 관계를 만들고 페이지에서 "후"와 "섹션"을 스크랩했습니다.이 방법이 가장 효율적인 방법인지 확신 할 수 없습니다. 데이터베이스를 처리 할 때 다운 스트림 문제/작업을 만듭니다. 매번 ManyToMany 목록을 확인해야합니다.하지만 작동합니다. 더 효율적인 접근 방식이 무엇인지 확신 할 수 없습니까? – Turukawa

관련 문제