SQL Alchemy Python 查询 query.first() 与
我正在修改一些我没有写过的代码。这个代码的问题在于,快递公司的追踪号码开始重复了。所以对于某个特定的追踪号码,数据库里可能会有两行甚至三行记录。这个代码显然是找到查询中的第一条记录,而在我们的情况下,这条记录是“创建日期最早的”。
因此,我想了解如何将其更改为我考虑的两个选项之一,这样程序就只会提取最新的追踪号码。
- 获取查询的最后一条记录,并将其放入一个变量中。
- 在查询过滤器中使用“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()