2011-08-13 4 views
4

PyramidでSQLAlchemyを使用する際にいくつか問題があります。私は必要なものの例を見つけることができますが、通常は非常に短く欠けています。だから、私はやっと意味を成す斑点のあるコードで終わった。だから私は誰かが私がする必要があることの完全な例を与えることができると期待しています。ビューごとにデータベースを変更し、ビューごとに複数のデータベースにアクセスする

私はすべて同じスキーマを持つ4つのデータベースを持っています。 1つのPyramidアプリから作業したいと思っています.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に応じてデータベースを切り替えるといいでしょう。しかし、どちらが選択されているかは完全にランダムなようです。 So/orders/site1 /は時々site2データベースに行き、時にはsite3に行きます。リフレッシュすると、たびに選択するデータベースが切り替わることがよくあります。他のURLと同じです。

セッションがデータベースにバインドされておらず、その時点でセッション内にあることが起こっているかのように、ほぼ同じですか?それは意味をなさないかもしれません - 私のSQLAlchemyの理解はあまり良くありません。

ビュー内でデータベースをすばやく簡単に切り替えることができ、現時点ではコントロールできないように見えるので、誰かが助けてくれることを願ってください。

注:

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

をしかしsqlahelperを見つけたとき、私はそれを削除: 私はもともと使用ピラミッドSQLA + URLディスパッチャのチュートリアルを以下と変えてみました。もし私がそれを使用しなければならないと私に知らせてください。

答えて

8

各リクエストの設定と接続は、私にとっては大変な作業のようです。私はモデルモジュールに4つのセッションハンドラを作成し、それらから選択します。

例:あなたのビューで

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")) 
関連する問題