双等号 == 语法在 SQLAlchemy 中如何工作

mit*_*tnk 0 python sqlalchemy

下面的代码是如何工作的?

result = session.query(Customers).filter(Customers.id == 2)
Run Code Online (Sandbox Code Playgroud)

根据我不扎实的 Python 知识,Customers.id == 2函数调用中使用的语法不是有效的吗?或者这样的foo == bar语法将首先将 eval 转换为布尔值,然后调用.filter(True/False).

pax*_*blo 5

回复你的陈述:

或者这样的foo == bar语法将首先被 eval 为布尔值

您可以使用dunder 方法(以及具有同样适当命名的方法的其他运算符)来覆盖相等运算符。__eq__


例如,以下代码显示了如何使使用该类的任何人感到困惑,除非他们是量子物理学家,深谙事物可以同时死和活的事实:

class Confusing(object):
    def __eq__(self, other): return True
    def __ne__(self, other): return True

deadCat = Confusing()
liveCat = Confusing()
if (deadCat == liveCat and deadCat != liveCat):
    print("Superposition of meow and deathly silence")
Run Code Online (Sandbox Code Playgroud)

在你的情况下,Customers.id是一种Column类型。我没有查看具体的 SqlAlchemy 代码,但Column.__eq__()几乎肯定会返回一些过滤对象,而不是一个简单的True/False值,然后将filter()其传递给从query().

这是该概念的一个大大简化的变体,当您有一个可以添加到的键/值集合时,并且相等检查的结果是具有所请求值的所有键的列表:

class KeyValCollection(object):
    def __init__(self):
        self._keyVals = []

    def add(self, key, val):
        self._keyVals += [(key, val)]

    def __eq__(self, compVal):
        return [item[0] for item in self._keyVals if item[1] == compVal]

x = KeyValCollection()
x.add("pax", 42)
x.add("arthur", 43)
x.add("bill", 42)
x.add("carl", 44)
x.add("david", 42)

print(x == 42)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,其输出既不是也不TrueFalse

['pax', 'bill', 'david']
Run Code Online (Sandbox Code Playgroud)