我在Python 3中使用SQLAlchemy
,并且很困惑为什么下面的代码能够工作 - 它让我觉得应该是一个对象级别的变量是一个类变量。我已经看到Why is instance variable behaving like a class variable in Python?这与我的问题没有关系。python对象实例变量看起来像一个类变量?
我有一个db
模块下面的声明中,我创建的Base
一个实例,并在其上设置一个query
变量指向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
然后我的模型类的声明如下:
import db
class MyModel(db.Base):
id = Column(Integer)
# more model stuff
然后我可以运行通过访问query
可变查询如下:
return MyModel.query.filter(MyModel.id == 22).first()
这并不工作,但它看起来好像存在于类级别的query
变量,而不是在对象实例水平,我能够直接通过类访问。
我不理解什么?
我很难理解为什么你会希望'查询'不能在课堂级别......也许你可以编辑你的帖子并解释一下更好吗? – mgilson
我认为'Base = sa_ed.declarative_base()'正在创建'Base'类I.e的一个实例。一个“Base”类型的对象。我现在看到它正在创建一个班级,这更有意义 – user783836
啊......是的,我想这会造成一些混乱。从一个函数(而不是一个类实例)返回一个类是一种有点不正常的模式,但在某些情况下它肯定是有用的。 – mgilson