鍍金池/ 問(wèn)答/Python  數(shù)據(jù)庫(kù)/ Flask-SQLAlchemy選擇日期等于今天的數(shù)據(jù)

Flask-SQLAlchemy選擇日期等于今天的數(shù)據(jù)

ORM模型Tokens有個(gè)字段是創(chuàng)建時(shí)間,如下:

 create_time = db.Column(db.DateTime, nullable=False, default=datetime.now)

數(shù)據(jù)庫(kù)中截圖:
clipboard.png

要選擇日期等于今天的數(shù)據(jù),簡(jiǎn)單在stackoverflow上搜了搜,使用了cast函數(shù),如下:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

# 省略部分代碼

for t in Tokens.query.filter(Tokens.user_id == user_id).all():
    print(t.id, db.cast(t.create_time, db.DATE) == db.cast(current_time. db.Date))

db.cast(t.create_time, db.DATE)應(yīng)該是能將時(shí)間轉(zhuǎn)換成日期的,但是上述語(yǔ)句print出來(lái)的結(jié)果是:

clipboard.png

單獨(dú)print(type(db.cast(t.create_time, db.DATE)))則結(jié)果是<class 'sqlalchemy.sql.elements.Cast'>,按道理不管db.cast產(chǎn)生的結(jié)果是什么類型,db.cast(t.create_time, db.DATE) == db.cast(current_time. db.Date)的結(jié)果都應(yīng)該是True or False嗎?

回答
編輯回答
柒喵
按道理不管db.cast產(chǎn)生的結(jié)果是什么類型,db.cast(t.create_time, db.DATE) == db.cast(current_time. db.Date)的結(jié)果都應(yīng)該是True or False嗎?

如果sqlalchemy 通過(guò)實(shí)現(xiàn)魔術(shù)方法__eq__重載了運(yùn)算符==, 那這兩個(gè)對(duì)象的==操作就不一定返回True/False
舉個(gè)例子:

>>> class C(object):
    def __init__(self, name):
        self.name = name
    def __eq__(self, other):
        return '{}=={}'.format(self.name, other.name)

    
>>> a = C('jack')
>>> b = C('lucy')
>>> a == b
'jack==lucy'
2017年2月27日 21:18
編輯回答
入她眼

已經(jīng)解決,就是使用

Tokens.query.filter(Tokens.user_id == user_id,
    db.cast(Tokens.create_time, db.DATE) == db.cast(current_time, db.DATE)).all()

可以選擇日期為今天的數(shù)據(jù)。
print(db.cast(Tokens.create_time, db.DATE) == db.cast(current_time, db.DATE))出現(xiàn)不明白的字符,個(gè)人猜測(cè)是內(nèi)置的class修改了__repr__方法,包括使用print(type(db.cast(t.create_time, db.DATE) == db.cast(current_time, db.Date)))出來(lái)的結(jié)果也是<class 'sqlalchemy.sql.elements.BinaryExpression'>,但可以把它當(dāng)成普通的布爾值去使用。

2017年12月8日 21:33
編輯回答
若相惜
for t in Tokens.query.filter(Tokens.user_id == user_id).all():
    print(t.id, t.create_time.date() == current_time,now())

你的 create_time 字段本身就是通過(guò) datetime.now() 來(lái)創(chuàng)建的。因此,datetime 對(duì)象的數(shù)據(jù)是直接支持 date() 函數(shù)的。

2017年4月3日 01:58