首页 > 解决方案 > SQLAlchemy 中的 double equal == 语法如何工作

问题描述

以下代码如何工作?

result = session.query(Customers).filter(Customers.id == 2)

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

标签: pythonsqlalchemy

解决方案


重新声明:

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

您可以通过使用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")

在您的情况下,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)

正如预期的那样,它的输出既不是True也不是False

['pax', 'bill', 'david']

推荐阅读