sqlalchemy колба игнорирует and_ и func.DATE в запросе фильтра - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть этот запрос, который пытается найти запись с данным днем ​​и статусом:

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 базы данных:

2018-11-13 00:00:00.000000

, которая является вчерашней датой, но выбирает ее только на основе статуса, почти так же, как он выглядит какИЛИ ЖЕ.Импорт, который я использую:

from sqlalchemy import func, and_

1 Ответ

0 голосов
/ 20 ноября 2018

Распечатайте фактический 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

Там вы видите, что равенство lunch_day.timestamp и параметра timestamp_1 передается в функцию DATE.

Что на самом деле довольно легко увидеть в вашем запросе sqlalchemy: func.DATE(LunchDay.timestamp == datetime.date.today()).Я предполагаю, что вы хотите преобразовать LunchDay.timestamp в дату и , затем сравнить ее с datetime.date.today(), которая должна быть db.func.DATE(LunchDay.timestamp) == date.today().

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

отпечатков:

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(), автоматически обрабатываются как and_(), поэтому вы можете немного упростить свой запрос, убрав следующее:

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