我在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