Pylons:如何使用反射模型定义进行声明

时间:2010-06-17 09:51:26

标签: pylons

美好的一天!

我正在学习Pylons web框架来为我的数据库创建Web UI。 目前我正在探索宣布我的模型的方法。最性感的方式似乎是用反思声明。 我可以和Pylons一起使用吗? (因为model / init .py声明我需要在init_model中定义与反射相关的人员)

谢谢!

2 个答案:

答案 0 :(得分:2)

有关Pylons 1.0中的最新答案,请参阅SQLAlchemy declarative syntax with autoload (reflection) in Pylons

  

解决方案是在model/__init__.py之外声明模型对象。我在model模块中创建了一个新文件,例如objects.py。然后我在此文件中声明了所有模型对象(如Event)。然后,我可以像这样导入我的模型:

from PRJ.model.objects import Event
  

此外,为避免为每个表格指定autoload-with,我在init_model()末尾添加了这一行:

Base.metadata.bind = engine
  

这样我可以声明我的模型对象没有样板代码,如下所示:

class Event(Base):
    __tablename__ = 'events'
    __table_args__ = {'schema': 'events', 'autoload': True}

    event_identifiers = relationship(EventIdentifier)

    def __repr__(self):
        return "<Event(%s)>" % self.id

答案 1 :(得分:0)

您使用的是Pylons 0.9.7版吗? Pylons allrady稳定在1.0版本。

您可以在init_model函数之外的model / init .py中使用带有反射的声明。或者,您可以在任何其他模块或包中分离模型定义。

模型/ schema.py

from YOURAPP.model.meta import Base        # for declaration you models and reflection
from YOURAPP.model.meta import Session     # for using sa session object

class Category(Base):
    __tablename__ = 'category'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode(70), index=True, unique=True)


    def __unicode__(self):
        return self.name


class Attribute(Base):
     __tablename__ = 'attribute'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode(70), index=True)


    #Relation
    category_id = Column(Integer, ForeignKey('category.id'))
    category = relation(Category, backref=backref('attributes',
                    order_by=(name,))


    def __unicode__(self):
        return self.name

在model / init .py

from YOURAPP.model.schema import Category, Attribute