2

私はデータベースアクセスにSQLAlchemyを使用してPythonサーバーアプリケーションに取り組んでいます。データベースにアクセスするためにプログラム全体で使用されるmeta.pyモジュールにエンジン、セッション、およびメタデータオブジェクトを配置したいと思います(Pylons規則のように)。

エンジンオブジェクトとセッションオブジェクトはNone、meta.pyモジュールのように初期化されてから、他のモジュールで実際に実際の値が割り当てられます。例えば

model/meta.py

engine = None
Session = None
metadata = Metadata()

model/__init__.py

from simplesite.model import meta

def init_model():
    # ...
    sm = orm.sessionmaker(...)
    meta.Session = orm.scoped_session(sm)

問題はinit_model()、別のモジュールをインポートして実行し、meta.pyからSessionをインポートしても、Noneに設定されたままになることです。つまり

from model.meta import Session
from model import init_model

init_model()
# Session is still None!

誰かがこれがなぜであるか、および/またはそれがPylonsアプリケーションでどのように機能するかを教えてもらえますか?答えはPythonがどのように機能するかについてもっと基本的なものになると思いますか?

アプリケーション全体で単一のデータベースアクセスポイントを使用する方法に関する代替案もありがたいです(つまり、大規模なアプリケーションでSQLAlchemyを使用するためのベストプラクティス)。

4

1 に答える 1

1

@katrielalex のコメントに回答がありましたが、ここに座っているだけのように見えるので、これに回答しています。

を実行すると、そのモジュールのオブジェクトにバインドされるというfrom model.meta import Session新しいローカル変数が作成されます。Session実行すると、モジュールinit_model()内の名前が再バインドされmetaますが、これはローカル変数には影響しません。

meta.Sessionafterinit_model()が作業を完了するまでアクセスしないことで、目的の効果を得ることができます。

from model import meta
from model import init_model
init_model()
Session = meta.Session
于 2012-06-24T06:36:32.570 に答える