【问题标题】:Order query by count of one-to-many relationship per hour - SQLAlchemy按每小时一对多关系计数的顺序查询 - SQLAlchemy
【发布时间】:2018-03-04 14:17:58
【问题描述】:

我正在开发一个购买/销售游戏内物品的视频游戏拍卖网站。 我希望能够查询 Auctions 表并按“最热门”拍卖对其进行排序。这是基于在拍卖中每小时的出价数量。

这是拍卖模型:

class Auctions(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    posted = db.Column(db.DateTime())
    end = db.Column(db.DateTime())
    ...

    bids = db.relationship('Bids', backref='auctions', lazy='dynamic', order_by='desc(Bids.amount)', cascade="all, delete-orphan")

这是出价模型:

class Bids(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    bidder_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True)
    auction_id = db.Column(db.Integer, db.ForeignKey('auctions.id'), index=True)
    amount = db.Column(db.Integer)
    posted = db.Column(db.DateTime())

我可以像这样按出价数量对它们进行排序:

hot_stmt = db.session.query(models.Bids.auction_id, func.count('*').label('bid_count')).group_by(models.Bids.auction_id).subquery()
hot = db.session.query(models.Auctions, hot_stmt.c.bid_count).outerjoin(hot_stmt, (models.Auctions.id == hot_stmt.c.auction_id)).order_by(hot_stmt.c.bid_count.desc()).limit(5)

我可以用这个计算和列出每小时的出价:

for auc, count in hot:
    time_delta = datetime.utcnow() - auc.posted
    auc_hours = time_delta.seconds / 60 / 60
    print(auc.id, count / auc_hours)

如何按出价/小时对查询进行排序,以便查询返回前 5 个最热门的拍卖?

【问题讨论】:

    标签: python flask sqlalchemy relationship


    【解决方案1】:

    一种有用的方法是创建一个字典,其中拍卖作为键,出价/小时作为值:

    d = {}
    for auc, count in hot:
        time_delta = datetime.utcnow() - auc.posted
        auc_hours = time_delta.seconds / 60 / 60
        d[auc] = count / auc_hours
    

    列出拍卖清单:

    aucs = [auc for auc, count in hot]
    

    根据值对列表aucs进行排序(使用reverse关键字将最高值放在列表的开头,因为排序函数默认从最低到最高):

    aucs.sort(key=d.get, reverse=True)
    

    【讨论】:

    • 感谢您的回复!我原来的帖子没有说清楚。我想让查询返回前 5 个最热门的拍卖,因此需要使用 SQLAlchemy 进行排序,以便我可以简单地限制查询以获得前 5 个。如果我只查询所有当前拍卖的拍卖表,这将起作用然后这样排序,我只是担心性能。
    • 我几乎可以肯定list.sort 函数是用 C 语言编写的,而且速度非常快。很容易尝试看看性能是否可以接受。
    • 我主要关心数据库的负载。我不太了解两者之间的性能差异。我认为返回 1000 多个结果然后排序/修剪会比在已经排序的查询中返回 5 个结果要慢。
    • 这不是我想要的,但它可以完成工作。我已将其设置为每 5 秒更新一次的后台进程。这样它就不会在每个页面请求上运行。
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2014-05-17
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多