2

Python noob 试图学习 Pylons。我正在使用 1.0 文档中的 QuickWiki 教程(http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/),但这个所谓的“1.0”文档似乎只是“0.9.7”;我怀疑这与我遇到的错误有关。

当我执行“paster setup-app development.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='')
                )

没有记录器 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 答案的评论询问这是否在 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 声明式自动执行此操作。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 回答