Flask sqlalchemy在筛选器查询中忽略and_u和func.DATE

Flask sqlalchemy在筛选器查询中忽略and_u和func.DATE,flask,sqlalchemy,flask-sqlalchemy,Flask,Sqlalchemy,Flask Sqlalchemy,我有一个查询,它试图查找给定日期和状态的记录: ld=LunchDay.query.filter(and_(func.DATE(LunchDay.timestamp == datetime.date.today()), LunchDay.status==1)) 模型: class LunchDay(db.Model): __tablename__ = 'lunch_day' id = db.Column(db.Integer, primary_key=True) us

我有一个查询,它试图查找给定日期和状态的记录:

ld=LunchDay.query.filter(and_(func.DATE(LunchDay.timestamp == datetime.date.today()), LunchDay.status==1))
模型:

class LunchDay(db.Model):
    __tablename__ = 'lunch_day'

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = relationship("User", foreign_keys=[user_id])
    timestamp = db.Column(db.DateTime, index=True, default=datetime.today())
    status = db.Column(db.Integer) 
它运行并且不抛出错误,但它似乎不考虑日期。它将在数据库的DateTimeField中找到日期与yesterdays类似的条目:

2018-11-13 00:00:00.000000
这是昨天的日期,但它只是根据状态来选择它,几乎就像它将其视为OR一样。我使用的导入是:

from sqlalchemy import func, and_

打印出查询生成的实际sql以查看发生了什么。例如:

ld=LunchDay.query.filter(and_(func.DATE(LunchDay.timestamp == datetime.date.today()), LunchDay.status==1))
print(ld)
印刷品:

SELECT lunch_day.id AS lunch_day_id, lunch_day.timestamp AS lunch_day_timestamp, lunch_day.status AS lunch_day_status
FROM lunch_day
WHERE DATE(lunch_day.timestamp = %(timestamp_1)s) AND lunch_day.status = %(status_1)s
在这里,您可以看到
午餐日.timestamp
和参数
timestamp_1
的相等值被传递给
日期
函数

这在sqlalchemy查询中非常容易看到:
func.DATE(午餐日.timestamp==datetime.DATE.today())
。我假设您要将
午餐日.timestamp
转换为日期,然后将其与
datetime.date.today()
进行比较,后者应为
db.func.date(午餐日.timestamp)=date date.today()

印刷品:

SELECT lunch_day.id AS lunch_day_id, lunch_day.timestamp AS lunch_day_timestamp, lunch_day.status AS lunch_day_status
FROM lunch_day
WHERE DATE(lunch_day.timestamp) = %(DATE_1)s AND lunch_day.status = %(status_1)s
另一件需要注意的事情是,传递给
filter()
的多个语句会自动被视为
和uxAE()
,因此您可以通过删除以下语句来简化查询:

LunchDay.query.filter(func.DATE(LunchDay.timestamp) == datetime.date.today(), LunchDay.status == 1)

这样做了,我的括号只是在错误的位置,并感谢额外的信息了!令人惊叹的
LunchDay.query.filter(func.DATE(LunchDay.timestamp) == datetime.date.today(), LunchDay.status == 1)