1

我正在尝试创建一个金字塔框架身份验证插件/插件。插件需要有一个存储用户登录和其他数据的数据库,所以如果用户使用我的插件,他的数据库必须包含插件中的某些表/模型。例如这个用户表

class User(Base):
    __tablename__ = 'User'
    id = Column(Integer, primary_key=True)
    username = Column(Text())
    user_firstname = Column(Text())
    user_lastname = Column(Text())
    user_email = Column(Text())
    user_password = Column(Text())
    user_registrationdate = Column(DateTime())
    user_email_key = Column(Text())
    user_email_key_date_created = Column(DateTime())
    user_email_approved = Column(Boolean())
    user_email_sent = Column(Boolean())
    user_active_account = Column(Boolean())
    user_banned = Column(Boolean())
    user_banned_reason = Column(Text())

我需要将此模型包含在用户主应用程序中,我猜我必须在我的 includeme 中包含一些内容,如下所示

def includeme(config):
    config.include('pyramid_mako')
    config.add_route('pyramid.admin', '/pyramid/admin')

    #static views
    config.add_static_view('assets', 'pyramidadmin:static/assets/')

    config.scan('pyramidadmin.views')

但我不知道该怎么做。有没有一种方法可以将我的插件中的 Base 和 DBSession 合并到主应用程序中的 base 中,这样如果用户../bin/initialize_myapp_db从 myaddon 运行表并从主应用程序全部创建?

4

2 回答 2

0

您可以使用以下方法:

import sqlalchemy
import sqlalchemy.orm as orm
from zope.sqlalchemy import ZopeTransactionExtension
from sqlalchemy.ext.declarative import declarative_base

DBSession = None

def get_sa_base(engine):
    sabase = sqlalchemy.ext.declarative.declarative_base()
    sabase.metadata.reflect(engine)
    return sabase

def includeme(config):
    global DBSession
    engine = sqlalchemy.engine_from_config(config.registry.settings)
    if DBSession is None:
        DBSession = orm.scoped_session(
            orm.sessionmaker(extension=ZopeTransactionExtension()))
    DBSession.remove()
    DBSession.configure(bind=engine)
    Base = get_sa_base(engine)

    # example:
    Base.metadata.tables.values()

一个例子可以在这里找到。

于 2013-11-15T20:53:23.737 回答
0

我自己也有同样的问题。我仍在努力尝试使我的东西更具可插拔性,但结果喜忧参半。我解决这个问题的方法是将每个声明性基类绑定到同一个引擎。在我的通用脚手架中,我这样做:

# create db engine
engine = engine_from_config(settings, 'sqlalchemy.')
# setup db.sessionmaker
settings['db.sessionmaker'] = DBSession
# bind session to engine
DBSession.configure(bind=engine)
# bind objects to engine
Base.metadata.bind = engine
from trumpet.models.base import Base as TrumpetBase
TrumpetBase.metadata.bind = engine
if settings.get('db.populate', 'False') == 'True':
    from mslemon.models.main import make_test_data
    import mslemon.models.misslemon
    Base.metadata.create_all(engine)
    TrumpetBase.metadata.create_all(engine)
    #initialize_sql(engine)
于 2013-12-02T16:12:36.660 回答