2013-11-15 21 views
1

我想創建一個金字塔框架認證插件/插件。插件需要有一個存儲用戶登錄和其他數據的數據庫,所以如果用戶使用我的插件,他的數據庫必須包含來自插件的某些表/模型。例如,該用戶表金字塔框架包括從插件到主應用程序models.py

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合併到主應用程序的基礎中,以便如果用戶運行../bin/initialize_myapp_db,則myaddon和主應用程序中的表格都會創建?

回答

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() 

一個例子可以發現here

0

我自己也有同樣的問題。我仍在努力嘗試讓我的東西更容易插入,但結果不一。我解決這個問題的方法是用相同的引擎綁定每個聲明基類。在我的通用scaffolding我這樣做:

# 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)