2016-02-25 44 views
0

我必須實現以下需求:存儲「頁面」,它是「修訂」。像:SQLAlchemy數據庫設計修訂

class Page(Base): 
    __tablename__ = 'Page' 
    page_id = Column(Integer, primary_key=True) 

class Revision(Base): 
    __tablename__ = 'Revision' 
    revision_id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(32)) 
    content = Column(String(32)) 
    page_id = Column(Integer, ForeignKey('Page.page_id')) 
    page = relationship('Page', uselist=False, backref='revisions') 

我希望能夠得到頁面,它的內容透明的喜歡:

page = session.query(Page).filter(Page.page_id == 42).one() 
page.name 
page.content 

我看SQLAlchemy inheritance doc,但我不知道如果我不能做到這一點與繼承。

是否有可能做這樣的事情?怎麼樣 ?

+0

我會考慮「類型2數據倉庫」。基本保持有效的開始日期和有效的結束日期,最新的有效結束日期爲空。 – reptilicus

回答

0

你上面的ORM定義無效。您嘗試運行此代碼時遇到的「繼承」錯誤是誤導性的。你的例子與繼承無關,你不需要它。你想要建模的是頁面(一)和修訂(許多)之間的簡單的一對多關係。您定義的主要問題:

  1. 它缺少__tablename__
  2. Revision表中缺少參考Pagepage_id
  3. page關係定義是不正確

這裏是正確的定義+完整示例(請注意,我還添加了autoincrement,因此您不必生成主鍵):

class Page(Base): 
    __tablename__ = 'Page' 
    page_id = Column(Integer, primary_key=True, autoincrement=True) 

class Revision(Base): 
    __tablename__ = 'Revision' 
    revision_id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(32)) 
    content = Column(String(32)) 
    page_id = Column(Integer, ForeignKey('Page.page_id')) 
    page = relationship('Page', uselist=False, backref='revisions') 


page = Page() 
first_revision = Revision(name='first_revision', content='foo', page=page) 
second_revision = Revision(name='second_revision', content='bar', page=page) 
session.add_all([page, first_revision, second_revision]) 
session.flush() 
session.commit() 
for rev in page.revisions: 
    print rev.revision_id, rev.name, rev.content, rev.page_id 
+0

問題代碼在這裏來說明問題。我爲將來的讀者編輯它。你的回答並不能解決我的問題:我的問題不夠清楚?我可以嘗試更新它。 – bux