私はPython 3でSQLAlchemy
を使用していますが、なぜ次のコードが動作するのか混乱しています。クラス変数として動作するオブジェクトレベルの変数が何であるかがわかります。私はWhy is instance variable behaving like a class variable in Python?を見ましたが、私の質問には関係していません。pythonオブジェクトのインスタンス変数は、クラス変数のように見えますか?
次のように私は私がBase
のインスタンスを作成し、SessionFactory
query_property()
import sqlalchemy as sa
import sqlalchemy.ext.declarative as sa_ed
Base = sa_ed.declarative_base()
engine = sa.create_engine('connection string')
session_factory = session or sa_orm.scoped_session(sa_orm.sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base.query = session_factory.query_property() # make the query_property available in models for querying
を指し、それにquery
変数を設定するdb
モジュールに次の宣言は、私のモデルクラスは、その後に宣言されています:
import db
class MyModel(db.Base):
id = Column(Integer)
# more model stuff
次のように私は、その後query
変数にアクセスしてクエリを実行できます。
return MyModel.query.filter(MyModel.id == 22).first()
これは機能しますが、それは私がクラスを介して直接アクセスすることができる午前としてquery
変数がオブジェクトインスタンス・レベルでクラスレベルで存在していないかのように見えます。
私は何を理解していませんか?
私は、あなたがなぜ 'query'がクラスレベルではないと期待しているのか理解できていないのです...あなたの投稿を編集し、それをより良く説明できるでしょうか? – mgilson
私は 'Base = sa_ed.declarative_base()'が 'Base'クラスのインスタンスを作成していると考えました。型 'Base'のオブジェクトです。私は今それがより意味をなさないクラスを作成しているのを見る – user783836
ああ...はい、それはいくつかの混乱のためになるだろうと思います。関数から(クラスインスタンスではなく)クラスを返すのは幾分異常なパターンですが、場合によっては間違いなく便利です。 – mgilson