2016-02-25 22 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