web-dev-qa-db-ja.com

sqlalchemyのscoped_session(sessionmaker())または単純なsessionmaker()?

私の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()オブジェクトを作成して閉じます。私は正しいことをしていますか、それとももっと良い方法がありますか?

31
northlondoner

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

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

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

28
tuomur

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

9
Abdul Kader

参考までに、flask-sqlalchemyを使用する場合、デフォルトで提供されるセッションオブジェクトはスコープ付きセッションオブジェクトです。

enter image description here

http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#road-to-Enlightenment

2
Nikhil Sahu

自分で調べていますが、専門家ではありません。

私の3つのポイントは次のとおりです。

  1. SQLAlchemy docsは、上記のKluev氏のコメントに従って、_scoped_session_を使用して提案されたアプローチをこのリンクで提供します: http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using- thread-local-scope-with-web-applications
  2. そのWebの場所で、SQLAlchemyのドキュメントには、「_scoped_session_の代わりに、可能であれば、Webフレームワーク自体に提供されている統合ツールを使用することを強くお勧めします」とも記載されています。
  3. たとえば、Flask-SQLAlchemyはこれを処理すると主張しているようです: http://pythonhosted.org/Flask-SQLAlchemy/quickstart.html#a-minimal-application
1
Soferio