sqlalchemy python查询query.first()和

时间:2011-10-12 04:36:10

标签: python sql sqlalchemy

我正在修改一些我没写过的代码。此代码的问题在于跟踪号码已开始与运营商一起回收。因此,对于给定的跟踪号,数据库中有时可能有两行。此代码显然在查询中找到第一条记录,在我们的例子中是“最早创建的日期”。

所以我想了解如何将此更改为我正在考虑的两个选项之一,因此该程序仅提取最新的跟踪号。

  1. 检索查询的最后一条记录并将其放入清单变量中。
  2. 在查询过滤器上使用“AND”。我有一个created_date列,我可以说: 如果跟踪号码=例外跟踪号码和创建日期> 1/1/20011。
  3. 因此,如果某人能提供#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?

1 个答案:

答案 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()