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)