2017-02-17 95 views
1

我正在將SQLAlchemy和Flask用於與postgres數據庫交談。我有了這樣的SQLAlchemy忽略查詢中的特定字段

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

定義的date_of_birth場現在客戶的模式,我想通過一個最低年齡這樣過濾這些:

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 

生成的SQL是完全一樣的,當我刪除day部分從查詢。爲什麼sqlalchemy忽略它?

回答

1

這是因爲你比較兩個tuple S:

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

元組進行比較的方法是,比較第一要素,如果他們不相等,則返回的結果,否則返回的比較第二個元素。因此,就你而言,這與將第一個元素比較在一起是一樣的。

而不是兩個tuple S,你應該比較的是tuple_結構,像這樣:

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

謝謝!這正是發生錯誤的地方。 –