0

我是编程新手,我正在按照 Pylons 文档中有关创建 Wiki 的示例进行操作。我想链接到 wiki 的数据库是用 Elixir 创建的,所以我重写了 Wiki 数据库模式并从那里继续。

在 wiki 中,需要一个由 Pages 和 Sections 继承的导航表。一个部分可以有很多页,而一个页面只能有一个部分。此外,每个兄弟节点可以相互链式引用。

所以:

  • 导航有“部分”(OneToMany)和“之前”(OneToOne - 引用前一个节点)
  • 页面有“部分”(ManyToOne - 一个部分中有许多页面)并继承“之前”
  • 部分从 Nav 继承所有

我编写的代码如下所示:

class Nav(Entity):
    using_options(inheritance='multi')
    name = Field(Unicode(30), default=u'Untitled Node')
    path = Field(Unicode(255), default=u'')
    section = OneToMany('Page', inverse='section')
    after = OneToOne('Nav', inverse='before')
    before = OneToMany('Nav', inverse='after')

class Page(Nav):
    using_options(inheritance='multi')
    content = Field(UnicodeText, nullable=False)
    posted = Field(DateTime, default=now())
    title = Field(Unicode(255), default=u'Untitled Page')
    heading = Field(Unicode(255))
    tags = ManyToMany('Tag')
    comments = OneToMany('Comment')
    section = ManyToOne('Nav', inverse='section')

class Section(Nav):
    using_options(inheritance='multi')

收到的错误:

sqlalchemy.exc.OperationalError: (OperationalError) table nav has no column named aftr_id u'INSERT INTO nav (name, path, aftr_id, row_type) VALUES (?, ?, ?, ?)'

我也试过:

   before = ManyToMany('Nav', inverse='before')

在 Nav 上,希望这可能会解决问题,但也不是。

这些声明的教程中的原始 SQLAlchemy 代码如下:

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)
})

任何帮助深表感谢。

4

1 回答 1

0

我认为您的模型大部分是正确的。我唯一找到的是section来自 Nav->Page 和返回的链接:

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

本教程只是Section(not Page) 是parent(class Nav),所以你应该有:

class Nav(Entity):
    section = ManyToOne('Section')
# and optionally inverse
class Section(Nav):
    children = ManyToOne('Nav')

基本上,要使模型清晰,请参见Sectiona Directory,其中Page就像 a File。它们都具有a (parent) section并且假设它们以某种方式排序,也具有before参考。

before和的部分after对我来说是正确的。所以剩下的唯一一件事是你的数据库模式不反映对象模型。您可以重新创建数据库模型吗?或者至少也发布生成的数据库脚本?

于 2010-03-18T21:02:16.167 回答