sql алхимический запрос Python query.first () _and - PullRequest
2 голосов
/ 12 октября 2011

Я изменяю код, который не написал.Проблема с этим кодом заключается в том, что номера отслеживания начали перерабатываться вместе с перевозчиком.Таким образом, для данного номера отслеживания в базе данных может быть две, иногда 3 строки.Этот код, очевидно, находит первую запись в запросе, которая в нашем случае является «самой старой датой создания».

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

  1. Получите последнюю записьзапрос и поместите его в переменную манифеста.
  2. используйте «И» в фильтре запроса.У меня есть столбец create_date, который я могу сказать: если номер отслеживания = номер отслеживания исключения И дата создания> 1/1/20011.

Так что, если кто-то может предоставить код, который # 1 и # 2Я был бы благодарен.

query = session.query(database.Manifest)
query = query.filter(database.Manifest.tracking_number==exception.TrackingNumber)

manifest = query.first()

Я думал, что для номера 2 утверждение может быть:

query = query.filter(_and(database.Manifest.tracking_number==exception.TrackingNumber, 
database.Manifest.created_date > '2011-01-01'))

хорошо?

1 Ответ

4 голосов
/ 12 октября 2011

Ваш первый вариант не может быть выполнен точно, если у вас нет столбца, например идентификатора, который поможет вам понять порядок, в котором строки были помещены в таблицу. (РЕДАКТИРОВАТЬ: из ваших прикрепленных комментариев кажется, что у вас есть поле create_at ...)

Таким образом, запрос будет

query = (session.query(database.Manifest)
         .filter_by(tracking_number=exception.TrackingNumber)
         .order_by(desc(database.Manifest.created_at)))   
manifest = query.first()

Если вы этого не сделаете, то вы должны полагаться на свою базу данных, просто возвращая строки в том порядке, в котором они были сначала вставлены с помощью магии, тогда вам нужно будет захватить все из них и взять последний

query = (session.query(database.Manifest)
         .filter_by(tracking_number=exception.TrackingNumber))
manifest = query.all()[-1]

И, честно говоря, вы не можете полагаться на свою базу данных, чтобы сделать это ... она, как правило, возвращает их так, как считает самым быстрым из доступных способов.

Что касается второго варианта, который вы запрашиваете, это будет просто

query = (session.query(database.Manifest)
         .filter_by(tracking_number=exception.TrackingNumber)
         .filter(database.Manifest.date > datetime.date(2011, 1, 1)))

manifest = query.first()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...