Pylons 1.0 AttributeError: у объекта 'module' нет атрибута 'metadata' - PullRequest
2 голосов
/ 10 июня 2010

Питон нуб пытается выучить пилоны.Я использую учебник QuickWiki (http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/) из документации 1.0, но этот предполагаемый документ "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$

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

Это ошибка в документации. http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/

Объявление таких таблиц страниц

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.Base.metadata и определяй свои модели, используяSqlAlchemy декларативное расширение базы http://www.sqlalchemy.org/docs/05/ormtutorial.html#creating-table-class-and-mapper-all-at-once-declaratively

2 голосов
/ 11 июня 2010

На всякий случай, если кто-то столкнется с той же проблемой, я включу мою модель. init и websetup:

"""=========================__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.")
2 голосов
/ 10 июня 2010

Ваш комментарий к ответу estin спрашивает, изменяется ли это между SqlAlchemy 0.5 и 0.6.

Это не так.Это то же самое.Это пилоны, которые имеют разные значения по умолчанию.Как говорит Эстин, по умолчанию Pylons создает декларативную_базу (), чтобы вы могли декларативно использовать SqlAlchemy.

class MyRecord(Base):
     __tablename__ = "myrecord"

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

Это вместо того, чтобы сначала указывать таблицы с использованием конструкций Table (), затем создавать ваши классы и затем использовать mapper() чтобы отобразить их вместе.

SqlAlchemy Declarative делает это автоматически.Quickwiki говорит вам использовать явную не декларативную версию SqlAlchemy, для которой нет никаких оснований (декларативная более лаконична).Пилоны использовали для представления метаданных по умолчанию как model.meta.metadata, но теперь они создаются функциейещательной_базы () и выставляются в model.meta.Base.metadata.

...