在学习SQLAlchemy时,查询中的where()
子句就像魔术一样,因为它很自然地表达了事物。
但是,我无法理解为什么它以这种方式起作用。
考虑这个问题:
.where(MyTable.MyColumn == 1)
理论上,在Python中传递的参数是它的值(从我的角度来看,引用可以被视为指针值),因此估计MyTable.MyColumn == 1
(作为值)然后传递给函数。但是,此函数的行为方式类似于“在执行实际查询时估计值”(即,就像真正的SQL WHERE子句一样)。
我理解NumPy中的类似行为(例如np.argwhere(myarray > 0)
)是通过返回在此条件下估计的每个元素的布尔值然后对其执行操作来实现的。例如。 np.asarray([[0,1,2],[1,2,0]]) > 0
会导致array([[False,True,True],[True,True,False]], dtype=bool)
,而np.argwhere()
只会对此值进行操作。我认为SQLAlchemy可能会使用类似的技术,但我仍然无法想出它们是如何实现它的。
有人能简单解释一下为何以及如何运作?
答案 0 :(得分:3)
我敢打赌MyTable.MyColumn
会覆盖__eq__
。 a == b
与a.__eq__(b)
基本相同。
因此,MyTable.MyColumn
只需覆盖__eq__
以返回选择器对象而不是bool。
重载示例:Try It Online!