我是编程新手,并且正在关注创建Wiki的Pylons文档中的示例。我想链接到wiki的数据库是用Elixir创建的,所以我重新编写了Wiki数据库模式并继续从那里开始。
在wiki中有一个requirement for a Navigation table,它由Pages和Sections继承。一个部分可以有很多页面,而一个页面只能有一个部分。此外,每个兄弟节点可以相互链接。
所以:
我写的代码如下:
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)表nav没有名为aftr_id的列u'INSERT INTO nav(name,path,aftr_id,row_type)VALUES(?,?,?,?)'
我也试过了:
before = ManyToMany('Nav', inverse='before')
希望这可能会打破这个问题,但也不是。
这些声明教程中的原始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)
})
非常感谢任何帮助。
答案 0 :(得分:0)
我认为你的模型大多是正确的。我找到的唯一一件事是来自Nav-> Page的链接section
,然后返回:
class Nav(Entity):
section = OneToMany('Page', inverse='section')
class Page(Nav):
section = ManyToOne('Nav', inverse='section')
教程只是Section
(不是Page
)是parent
(类Nav
),所以你应该改为:
class Nav(Entity):
section = ManyToOne('Section')
# and optionally inverse
class Section(Nav):
children = ManyToOne('Nav')
基本上,要明确模型,请将Section
视为Directory
,其中Page
就像File
。它们都有a (parent) section
,假设它们以某种方式排序,也有before
引用。
before
和after
的部分对我来说是正确的。所以唯一剩下的就是数据库模式不能反映对象模型。你能重新创建数据库模型吗?或者至少发布结果数据库脚本?