2013-04-26 441 views
0

我正在寫一個SQLAlchemy與SQLite數據庫的應用程序。我相信我的數據庫,表和映射配置正確,因爲其他操作按預期工作。我正在嘗試編寫一個函數,用於檢索其日期字段與作爲參數提供給該函數的datetime.date()相匹配的所有對象。這是我第一次嘗試:比較日期與SQLAlchemy,SQLite

def get_objects_matching_date(session,my_date): 
    return session.query(Table).filter(Table.date_field == my_date).all() 

事件雖然我知道Table包含對象的標準匹配,函數返回什麼。

我從閱讀SA documentation知道,sqlite沒有對datedatetime類型的本地支持,並且它們存儲爲字符串。但SA應該處理轉換(返回結果時)和來自(插入記錄時)datedatetime對象的轉換。我假設它在運行比較過濾器時也應該能夠處理這個問題。我已經閱讀了幾個不同的SO線程,並已考慮使用between()來篩選出與my_date匹配的對象,但是當確切的==是我正在尋找的對象時,似乎並不需要這樣做。我也研究過使用.filter(cast(Table.date_field,DATE) == my_date)來確保我得到對象的比較,但是這似乎也不起作用。

顯然我錯過了SQLAlchemy處理日期的方式,特別是SQLite數據庫。我如何才能獲得存儲在SQLAlchemy的SQLite數據庫中的Date與作爲參數提供的datetime.date()對象之間的精確匹配?謝謝你的幫助。

回答

0

這個問題確實存在於Python中的字符串(SQLite中的Date對象的表示)和date對象之間的轉換。儘管遵循數據類型之間相當長的轉換順序(date-> datetime-> string),下面的解決方案似乎工作得很好。也許還有另外一種方式,但這是有效的。

def get_objects_matching_date(session,my_date): 
    return session.query(Table).\ 
     filter((strftime("%Y-%m-%d",datetime.combine(my_date,time()).timetuple())).all() 
3

這可能是很晚了,但遲到總比不到好,所以它可能有益於他人:)

都去嘗試一下鑄造日期:

from sqlalchemy import Date, cast 
from datetime import datetime 

created_at = datetime.now().date() 
query.filter(cast(Model.created_at, Date) == cast(created_at,Date)) 
+0

爲我工作!謝謝! – fatman13 2017-03-24 06:57:00