SQLAlchemy忽略查询中的特定字段

时间:2017-02-17 15:38:16

标签: python postgresql sqlalchemy flask-sqlalchemy

我正在使用SQLAlchemy和Flask与postgres数据库交谈。我有一个Customer模型,其date_of_birth字段定义如下

class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    date_of_birth = Column(Date)

现在,我试图按照这样的最小年龄过滤这些:

q.filter(date.today().year - extract('year', Customer.date_of_birth) - cast((today.month, today.day) < (extract('month', Customer.date_of_birth), extract('day', Customer.date_of_birth)), Integer) >= 5)

但生成的SQL似乎忽略了day部分并将其替换为常量。看起来像这样

SELECT customer.date_of_birth AS customer_date_of_birth,
FROM customer
WHERE (2017 - EXTRACT(year FROM customer.date_of_birth)) - CAST(EXTRACT(month FROM customer.date_of_birth) > 2 AS INTEGER) >= 5

当我从查询中删除day部分时,生成的SQL完全相同。为什么sqlalchemy无视它?

1 个答案:

答案 0 :(得分:1)

这是因为您要比较两个tuple

(today.month, today.day) < (extract('month', Customer.date_of_birth), extract('day', Customer.date_of_birth))

元组比较的方式是,比较第一个元素,如果它们不相等则返回结果,否则返回第二个元素的比较。因此,在您的情况下,它与将第一个元素进行比较相同。

而不是两个tuple,你应该比较的是tuple_结构,如下所示:

(today.month, today.day) < tuple_(extract('month', Customer.date_of_birth), extract('day', Customer.date_of_birth))