在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

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

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

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

要選擇日期等于今天的數(shù)據(jù),簡單在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)應該是能將時間轉換成日期的,但是上述語句print出來的結果是:

clipboard.png

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

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

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

>>> 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
編輯回答
入她眼

已經解決,就是使用

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)不明白的字符,個人猜測是內置的class修改了__repr__方法,包括使用print(type(db.cast(t.create_time, db.DATE) == db.cast(current_time, db.Date)))出來的結果也是<class 'sqlalchemy.sql.elements.BinaryExpression'>,但可以把它當成普通的布爾值去使用。

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 字段本身就是通過 datetime.now() 來創(chuàng)建的。因此,datetime 對象的數(shù)據(jù)是直接支持 date() 函數(shù)的。

2017年4月3日 01:58