2

パイロンを学ぼうとしているPython初心者。1.0ドキュメントのQuickWikiチュートリアル(http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/)を使用していますが、この「1.0」とされるドキュメントは「0.9.7」のようです。これは私が得ているエラーと関係があるのではないかと思います。

「pastersetup-appdevelopment.ini」を実行すると、次のようになります。

(mydevenv)lucid@lucid-laptop:~/QuickWiki$ paster setup-app development.ini
Traceback (most recent call last):
... edited for brevity...
File "/home/lucid/mydevenv/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg/pkg_resources.py", line 1954, in load
File "/home/lucid/QuickWiki/quickwiki/config/middleware.py", line 11, in <module>
from quickwiki.config.environment import load_environment
File "/home/lucid/QuickWiki/quickwiki/config/environment.py", line 12, in <module>
from quickwiki.model import init_model
File "/home/lucid/QuickWiki/quickwiki/model/__init__.py", line 27, in <module>
pages_table = sa.Table('pages', meta.metadata,
AttributeError: 'module' object has no attribute 'metadata'
(mydevenv)lucid@lucid-laptop:~/QuickWiki$
4

3 に答える 3

4

これはドキュメントの誤りですhttp://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/

このようにpages_tableを宣言します

from quickwiki.model.meta import Base
pages_table = sa.Table('pages', Base.metadata,
                sa.Column('title', sa.types.Unicode(40), primary_key=True),
                sa.Column('content', sa.types.UnicodeText(), default='')
                )

loger meta.metadata はありません。meta.Base.metadata を使用し、SqlAlchemy 宣言ベース拡張http://www.sqlalchemy.org/docs/05/ormtutorial.html#creating-table-class-and-mapper-allを使用してモデルを定義します。 -一度に宣言的に

于 2010-06-10T04:36:52.060 に答える
2

estin answer に関するあなたのコメントは、これが SqlAlchemy 0.5 と 0.6 の間で変化するかどうかを尋ねます。

そうではありません。それは同じだ。現在、デフォルトが異なるのは Pylons です。estin が言うように、Pylons はデフォルトで declarative_base() を作成するため、SqlAlchemy を宣言的に使用できます。

class MyRecord(Base):
     __tablename__ = "myrecord"

     id = Column(Integer, primary_key=True)
     data = Column(Unicode, nullable=False)

これは、最初に Table() コンストラクトを使用してテーブルを指定し、次にクラスを作成してから mapper() を使用してそれらを一緒にマップする代わりです。

SqlAlchemy Declarative はこれを自動的に行います。Quickwiki では、SqlAlchemy の明示的な非宣言バージョンを使用するように指示されていますが、これには理由がありません (宣言はより簡潔です)。Pylons はデフォルトのメタデータを model.meta.metadata として公開していましたが、現在は declarative_base() によって作成され、model.meta.Base.metadata で公開されています。

于 2010-06-10T18:33:29.900 に答える
2

誰かが同じ問題に遭遇した場合に備えて、私のモデルを含めます。初期化とウェブセットアップ:

"""=========================__init__.py========================="""
    """The application's model objects"""
from quickwiki.model.meta import Session, Base


def init_model(engine):
    """Call me before using any of the tables or classes in the model"""
    Session.configure(bind=engine)

import logging
import re
import sets
from docutils.core import publish_parts

from pylons import url
from quickwiki.lib.helpers import link_to

log = logging.getLogger(__name__)

# disable docutils security hazards:
# http://docutils.sourceforge.net/docs/howto/security.html
SAFE_DOCUTILS = dict(file_insertion_enabled=False, raw_enabled=False)
wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)", re.UNICODE)

from sqlalchemy import orm
import sqlalchemy as sa

pages_table = sa.Table('pages', Base.metadata,
                sa.Column('title', sa.types.Unicode(40), primary_key=True),
                sa.Column('content', sa.types.UnicodeText(), default='')
                )

class Page(object):

    def __init__(self, title, content=None):
        self.title = title
        self.content = content

    def get_wiki_content(self):
        """Convert reStructuredText content to HTML for display, and
        create links for WikiWords
        """
        content = publish_parts(self.content, writer_name='html',
                                settings_overrides=SAFE_DOCUTILS)['html_body']
        titles = sets.Set(wikiwords.findall(content))
        for title in titles:
            title_url = url(controller='pages', action='show', title=title)
            content = content.replace(title, link_to(title, title_url))
        return content

    def __unicode__(self):
        return self.title

    __str__ = __unicode__

orm.mapper(Page, pages_table)

"""=========================websetup.py========================="""

"""Setup the QuickWiki application"""
import logging

import pylons.test

from quickwiki.config.environment import load_environment
from quickwiki.model.meta import Session, Base
from quickwiki import model

log = logging.getLogger(__name__)

def setup_app(command, conf, vars):
    """Place any commands to setup quickwiki here"""
    load_environment(conf.global_conf, conf.local_conf)

    # Create the tables if they don't already exist
    log.info("Creating tables...")
    Base.metadata.create_all(bind=Session.bind)
    log.info("Successfully set up.")

    log.info("Adding front page data...")
    page = model.Page(title=u'FrontPage',
                      content=u'**Welcome** to the QuickWiki front page!')

    Session.add(page)
    Session.commit()
    log.info("Successfully set up.")
于 2010-06-10T20:38:25.383 に答える