53

WebプロジェクトでSQlAlchemyを使用しています。何を使用する必要がありますscoped_session(sessionmaker())か(またはプレーンsessionmaker())、そしてその理由は何ですか?それとも私は何か他のものを使うべきですか?

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

engine = create_engine('mysql://dbUser:dbPassword@dbServer: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()リクエストごとにオブジェクトを作成し、閉じます。私は正しいことをしていますか、それともそれを行うためのより良い方法がありますか?

4

5 に答える 5

50

ドキュメントを読むことをお勧めします:

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

つまり、scoped_session()スレッドセーフに使用します。

于 2011-06-29T11:24:52.037 に答える
10

すべてのメソッドで Scoped_session はローカル セッションのスレッドを提供します.(モジュール レベルでのように)事前に取得することはできません.すべてのメソッドで新しいセッションを開く必要はありません. グローバル セッションを使用できます. .グローバル セッションは利用できません。つまり、セッションを返すメソッドを作成し、それをパッケージ内のinit .py に追加できます。

于 2011-06-29T11:41:40.250 に答える