我正在修改一些我没写过的代码。此代码的问题在于跟踪号码已开始与运营商一起回收。因此,对于给定的跟踪号,数据库中有时可能有两行。此代码显然在查询中找到第一条记录,在我们的例子中是“最早创建的日期”。
所以我想了解如何将此更改为我正在考虑的两个选项之一,因此该程序仅提取最新的跟踪号。
因此,如果某人能提供#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'))
OK?
答案 0 :(得分:4)
您的第一个选项无法准确完成,除非您有一个列,如标识,可帮助您了解行放入表中的顺序。 (编辑:从您附加的评论看来,您似乎有一个created_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()