Я новичок в программировании и следую примеру в документации Pylons по созданию Wiki. База данных, которую я хочу связать с вики, была создана с помощью Elixir, поэтому я переписал схему базы данных вики и продолжил оттуда.
В вики существует требование для таблицы навигации , которая наследуется страницами и разделами. Раздел может иметь много страниц, в то время как страница может иметь только один раздел. Кроме того, каждый узел-брат может быть связан по цепочке друг с другом.
Итак:
- У Nav есть «section» (OneToMany) и «before» (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: (навигация таблицы) не имеет столбца с именем aftr_id u'INSERT INTO nav (имя, путь, 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)
})
Любая помощь очень ценится.