Flask-SQLAlchemy选择日期等于今天的数据

ORM模型Tokens有个字段是创建时间,如下:

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

数据库中截图:
clipboard.png

要选择日期等于今天的数据,简单在stackoverflow上搜了搜,使用了cast函数,如下:

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吗?

阅读 10.6k
3 个回答

已经解决,就是使用

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

可以选择日期为今天的数据。
print(db.cast(Tokens.create_time, db.DATE) == db.cast(current_time, db.DATE))出现不明白的字符,个人猜测是内置的class修改了__repr__方法,包括使用print(type(db.cast(t.create_time, db.DATE) == db.cast(current_time, db.Date)))出来的结果也是<class 'sqlalchemy.sql.elements.BinaryExpression'>,但可以把它当成普通的布尔值去使用。

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() 来创建的。因此,datetime 对象的数据是直接支持 date() 函数的。

按道理不管db.cast产生的结果是什么类型,db.cast(t.create_time, db.DATE) == db.cast(current_time. db.Date)的结果都应该是True or False吗?

如果sqlalchemy 通过实现魔术方法__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'
推荐问题
宣传栏