我在Python 3中使用SQLAlchemy
并且很困惑为什么以下代码有效 - 它在我看来应该是一个对象级变量应该作为类变量。我看到Why is instance variable behaving like a class variable in Python?与我的问题无关。
我在db
模块中有以下声明,我在其中创建Base
的实例,并在其上设置query
变量,指向SessionFactory
{{ 1}}
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
然后我可以通过访问import db
class MyModel(db.Base):
id = Column(Integer)
# more model stuff
变量来运行查询,如下所示:
query
这确实有效,但看起来return MyModel.query.filter(MyModel.id == 22).first()
变量存在于类级而不是对象实例级,因为我可以直接通过类访问它。
我不理解什么?
答案 0 :(得分:0)
您之前将query
属性放在父类上:
Base.query = session_factory.query_property() # make the query_property available in models for querying
所以query
绝对是 a 类(Base
)的成员。由于MyModel
继承自Base
,MyModel
也应该有query
成员(由于继承的魔力)。