SQL Alchemy Python 查询 query.first() 与

2 投票
1 回答
3472 浏览
提问于 2025-04-17 04:08

我正在修改一些我没有写过的代码。这个代码的问题在于,快递公司的追踪号码开始重复了。所以对于某个特定的追踪号码,数据库里可能会有两行甚至三行记录。这个代码显然是找到查询中的第一条记录,而在我们的情况下,这条记录是“创建日期最早的”。

因此,我想了解如何将其更改为我考虑的两个选项之一,这样程序就只会提取最新的追踪号码。

  1. 获取查询的最后一条记录,并将其放入一个变量中。
  2. 在查询过滤器中使用“AND”。我有一个创建日期的列,可以这样说:如果追踪号码等于例外追踪号码,并且创建日期大于2001年1月1日。

所以如果有人能提供实现第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

你的第一个选项如果没有一个像身份标识这样的列,就无法准确完成,这个列可以帮助你理解表中行的插入顺序。(编辑:从你附上的评论来看,似乎你有一个 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()

撰写回答