2011-06-29 6 views
23

私はWebプロジェクトでSQlAlchemyを使用しています。私はscoped_session(session_maker())を使うべきか、あるいはplain session_maker()とWhy?それとも別のものを使うべきですか?scoped_session(session_maker())またはプレーンsession_maker()sqlalchemy?

## model.py 
from sqlalchemy import * 
from sqlalchemy.orm import * 

engine = create_engine('mysql://dbUser:[email protected]:dbPort/dbName', 
pool_recycle=3600, echo=False) 
metadata = MetaData(engine) 
Session = scoped_session(sessionmaker()) 
Session.configure(bind=engine) 
user = Table('user', metadata, autoload=True) 

class User(object): 
pass 

usermapper = mapper(User, user) 

## some other python file called abc.py 
from models import * 

def getalluser(): 
    session = Session() 
    session.query(User).all() 
    session.flush() 
    session.close() 

## onemore file defg.py 
from models import * 

def updateuser(): 
    session = Session() 
    session.query(User).filter(User.user_id == '4').update({User.user_lname: 'villkoo'}) 
    session.commit() 
    session.flush() 
    session.close() 

リクエストごとにsession = Session()オブジェクトを作成して閉じます。正しいことをやっているのですか、それとももっと良い方法がありますか? documentation読書

答えて

20

が推奨される:

scoped_session()関数は、セッションオブジェクトのスレッド管理レジストリを生成が提供されます。単一のグローバル変数を使用して、単一のスレッドにローカライズされたオブジェクトのセットを使用してトランザクションセッションを安全に表現できるように、Webアプリケーションでよく使用されます。

要するに、スレッドの安全性のためにscoped_session()を使用します。

+1

ありがとう。そして、要求ごとにセッションオブジェクトを開いて閉じるのは安全ですか? – northlondoner

+4

@northlondonerは、その安全だけでなく、推奨されるやり方で、http://www.sqlalchemy.org/docs/orm/session.html#lifespan-of-a-contextual-session –

+5

@DanielKluevを参照してください。長いページとそれはあなたのコメント以来しばらくしているので、私は間違ったことを読んでいる、またはページが変更されているが、ページが反対を言っているようだ。私には、この「しないでください」というコード例は、OPのコード例で使用されているパターンとよく似ています。ここでは、新しいセッションが各データベース要求に対して作成されています。これは、用語集の問題(ウェブページの要求とデータベースの要求)が混在しているのですか、または2つの抜粋の間にいくつかの違いがありますか? – mmitchell

7

すべてのメソッドでScoped_sessionを使用すると、あらかじめ取得できないローカルセッションのスレッドが提供されます(モジュールレベルなど)。すべてのメソッドで新しいセッションを開く必要はありません。グローバルセッションを使用できますグローバルセッションが利用できない場合にのみセッションを開始します。つまり、セッションを返すメソッドを記述して、パッケージ内の .pyに追加することができます。

+0

貴重な答えをありがとう。 – northlondoner

0

私は自分自身を見ていますが、私は専門家ではありません。

私の三点は以下のとおりです。 (I)SQLAlchemyのドキュメントは、このリンクでは、上記氏Kluevさんのコメントあたりscoped_sessionを使用して提案されたアプローチを、提供:http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using-thread-local-scope-with-web-applications。 (ii)SQLAlchemyのWebサイトでは、「scoped_sessionではなく、Webフレームワーク自体で提供されている統合ツールを利用できる場合は、そのツールを使用することを強くお勧めします。 (iii)Flask-SQLAlchemyは、たとえば、次のことを処理すると主張しているようです。http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application

+1

Flask-SQLAlchemyを使用する際の問題は、モデルにdb.Modelベースルートが必要なことです。あなたがwebapp以外のどこかから来たモデルを持っているなら、あなたは運が悪いです。したがって、scoped_session()が必要です。 –

関連する問題