私の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()
オブジェクトを作成して閉じます。私は正しいことをしていますか、それとももっと良い方法がありますか?
ドキュメント を読むことをお勧めします:
Session
オブジェクトのスレッド管理レジストリを生成するscoped_session()
関数が提供されています。これはWebアプリケーションで一般的に使用されるため、単一のグローバル変数を使用して、単一のスレッドにローカライズされたオブジェクトのセットでトランザクションセッションを安全に表すことができます。
つまり、スレッドの安全性のためにscoped_session()
を使用します。
Scoped_sessionはすべてのメソッドで(モジュールレベルのように)事前に取得できないローカルセッションのスレッドを提供します。すべてのメソッドで新しいセッションを開く必要はありません。グローバルセッションを使用できます。グローバルセッションは利用できません。つまり、セッションを返すメソッドを記述して、パッケージ内のinit。pyに追加できます。
参考までに、flask-sqlalchemyを使用する場合、デフォルトで提供されるセッションオブジェクトはスコープ付きセッションオブジェクトです。
http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#road-to-Enlightenment
自分で調べていますが、専門家ではありません。
私の3つのポイントは次のとおりです。
scoped_session
_を使用して提案されたアプローチをこのリンクで提供します: http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#using- thread-local-scope-with-web-applications 。scoped_session
_の代わりに、可能であれば、Webフレームワーク自体に提供されている統合ツールを使用することを強くお勧めします」とも記載されています。