2010-06-10 15 views
2

Noob Python essayant d'apprendre les pylônes. J'utilise le tutoriel QuickWiki (http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/) de la documentation de la version 1.0, mais ce prétendu document "1.0" semble être "0.9.7"; Je soupçonne que cela a quelque chose à voir avec l'erreur que je reçois.Pylons 1.0 AttributeError: l'objet 'module' n'a pas d'attribut 'metadata'

Quand j'execute "Paster setup-app development.ini", je reçois ceci:

(mydevenv)[email protected]:~/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)[email protected]:~/QuickWiki$ 

Répondre

2

Votre commentaire sur la réponse estin demande si cela change entre SqlAlchemy 0.5 et 0.6.

Ce n'est pas le cas. C'est le même. Ce sont les pylônes qui ont différents défauts par défaut. Comme le dit Pylons, il crée par défaut une base déclarative() afin que vous puissiez utiliser SqlAlchemy de manière déclarative.

class MyRecord(Base): 
    __tablename__ = "myrecord" 

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

Ceci est au lieu de spécifier d'abord les tables en utilisant le tableau() construit, puis en créant vos classes, puis en utilisant mappeur() pour les associer ensemble.

SqlAlchemy Declarative le fait automatiquement. Quickwiki vous dit d'utiliser la version non-déclarative explicite de SqlAlchemy, qui n'a aucune raison d'être (déclarative est plus concise). Les pylônes utilisés pour exposer les métadonnées par défaut comme model.meta.metadata mais maintenant il est créé par declarative_base() et exposé dans model.meta.Base.metadata.

+0

Merci d'avoir éclairci ça. Juste le niveau de verbosité dont j'avais besoin. – shiki

4

Ceci est erreurs dans les documents http://pylonshq.com/docs/en/1.0/tutorials/quickwiki_tutorial/

Declare pages_table comme ce

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='') 
       ) 

Non loger meta.metadata, utiliser meta.Base.metadata et définir vos modèles en utilisant SqlAlchemy extension de base déclarative http://www.sqlalchemy.org/docs/05/ormtutorial.html#creating-table-class-and-mapper-all-at-once-declaratively

+0

Est-ce que ce changement entre sqlalchemy 0,5 et 0,6? – shiki

+0

Merci de votre confirmation. Tout fonctionne bien et dandy maintenant. – shiki

2

Juste au cas où quelqu'un rencontre le même problème, j'inclus mon modèle. et init de 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.")