0

私はプログラミングが初めてで、Wiki の作成に関する Pylons ドキュメントの例に従っています。Wiki にリンクしたいデータベースは Elixir で作成されたので、Wiki データベースのスキーマを書き直して、そこから続けています。

Wiki には、ページとセクションによって継承されるナビゲーション テーブルの要件があります。セクションには複数のページを含めることができますが、ページにはセクションを 1 つしか含めることができません。さらに、各兄弟ノードは相互にチェーン参照できます。

そう:

  • Nav には「セクション」(OneToMany) と「前」(OneToOne - 前のノードを参照する) があります。
  • ページには「セクション」 (ManyToOne - 1 つのセクションに複数のページ) があり、「前」を継承します。
  • セクションは 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) テーブル nav には 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

あなたのモデルはおおむね正しいと思います。私が見つけた唯一のものは、sectionNav->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')

基本的にモデルを明確にするために、 はSectionとして、Directoryはとして見PageますFile。どちらも参照a (parent) sectionを持っており、何らかの方法でソートされていると仮定すると、before参照も持っています。

との部分は私には正しいように見えますbeforeafterしたがって、残っている唯一のことは、データベース スキーマがオブジェクト モデルを反映していないということです。db モデルを再作成できますか? または、少なくとも結果の db スクリプトも投稿しますか?

于 2010-03-18T21:02:16.167 に答える