2011-08-13 4 views
4

Pyramid에서 SQLAlchemy를 사용하는 데 문제가 있습니다. 내가 필요한 것을 찾을 수는 있지만, 일반적으로 매우 짧고 부족합니다. 그래서 나는 거의 의미가없는 뾰족한 코드로 끝났습니다. 그래서 나는 누군가가 내가해야 할 일에 대한 완전한 예를 보여 주길 바란다.뷰 당 데이터베이스 변경 및 뷰 당 여러 데이터베이스 액세스

동일한 스키마를 가진 4 개의 데이터베이스가 있습니다. 한 피라미드 앱에서 작업 할 수 있기를 원합니다. 때로는 모든 4 개의 데이터베이스에서 모든 "주문"을 나열하고 때로는 "site1"의 모든 "주문"을 나열하고 싶습니다. 스키마가 동일하므로 데이터베이스에 대해서도 동일한 모델 클래스를 사용합니다.

전 sqlahelper와 일반 SQLAlchemy를 사용해 보았습니다. 아래의 코드는 sqlahelper를 사용하지만 작동 아무것도 사용하는 것이 행복 해요 :

__init__.py

site1_eng = engine_from_config(settings, prefix='site1.') 
site2_eng = engine_from_config(settings, prefix='site2.') 
site3_eng = engine_from_config(settings, prefix='site3.') 

sqlahelper.add_engine(site1_eng, 'site1_eng') 
sqlahelper.add_engine(site2_eng, 'site2_eng') 

views.py 어떻게됩니까

def site_orders(request): 
    site = request.matchdict['site'] 
    db_eng = sqlahelper.get_engine(("%s_eng" % (site))) 
    conn = db_eng.connect() 
    dbsession = sqlahelper.get_session() 
    dbsession.configure(bind=conn) 

    orders = dbsession.query(Order).order_by(Order.cdate.desc())[:100] 

    return dict(orders=orders, pagetitle=(site+" Orders")) 

를?

글쎄 나는 URL에 따라 데이터베이스를 바꿀 것이기를 바랐다. 그러나 어떤 것이 선택되는지는 완전히 무작위로 보인다. 그래서/orders/site1 /은 때때로 site2 데이터베이스로 가고 때로는 site3으로 간다. 새로 고침은 매번 선택하는 데이터베이스를 전환합니다. 다른 URL과 동일합니다.

거의 마치 세션이 데이터베이스에 바인딩되지 않고 그 시점에서 세션 중 어떤 상황이든 피킹 중입니까? 그것은 이해가되지 않을 수도 있습니다 - SQLAlchemy에 대한 나의 이해는 크지 않습니다.

보기에서 데이터베이스를 쉽고 빠르게 전환 할 수있는 기능을 제공하므로 누군가를 도울 수 있기를 바랍니다. 현재는 제어가 불가능한 것처럼 보입니다.

참고 : 내가 원래 다음 사용 된 피라미드 SQLA + URL 디스패처 튜토리얼 변경하려고 않았다

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 

하지만 sqlahelper을 찾을 때 제거합니다. 내가 그것을 사용해야한다면 나에게 알려줘.

답변

8

각 요청에 대한 구성 및 연결은 많은 도움이 될 것 같습니다. 내 모델 모듈에 네 개의 세션 핸들러를 만들고 그 중 하나만 골라라.

예 :

models/__init__.py 

DBSession1 = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
DBSession2 = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
DBSession3 = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
DBSession4 = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
metadata1 = MetaData()               
metadata2 = MetaData()               
metadata3 = MetaData()               
metadata4 = MetaData()               

def initialize_sql(engines, drop_db=False):          
    DBSession1.configure(bind=engine[0]) 
    DBSession2.configure(bind=engine[1])            
    DBSession3.configure(bind=engine[2])            
    DBSession4.configure(bind=engine[3])            
    metadata1.bind = engine[0]            
    metadata2.bind = engine[1]            
    metadata3.bind = engine[2]            
    metadata4.bind = engine[3] 

다음보기 :

from mypackage.models import DBSession1, DBSession2, DBSession3, DBSession4 

def site_orders(request)              
    site = request.matchdict['site']              
    dbsession = globals().get("DBSession%d" % site)              
    orders = dbsession.query(Order).order_by(Order.cdate.desc())[:100]              
    return dict(orders=orders, pagetitle=(site+" Orders")) 
1

당신은 4 데이터베이스에서 모든 "주문"을 나열하는 SQLAlchemy의 세션에 직접

예 엔진을 설정할 수 있습니다 :

def site_orders(request): 
    ... 
    orders = [] 
    for engine in engines: 
     dbsession.bind = engine 
     orders += dbsession.query(Order).order_by(Order.cdate.desc())[:100] 

    return dict(orders=orders, pagetitle=(site+" Orders"))