python - 简单链接表所需的 SQLAlchemy group_by() 求和帮助

标签 python sqlalchemy flask-sqlalchemy

我四处寻找类似主题的帮助,但无法找到解决我的涉及 SQLAlchemy/Flask-SQLAlchemy 问题的正确解决方案。

情况如下:我有 3 个处理抽奖券数据的表。这些 table 如下: raffles table :

class RaffleModel(db.Model):
    __tablename__ = 'raffles'

    id = db.Column(db.Integer, primary_key=True)

    # relationship to users
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    user = db.relationship("UserModel", backref="raffles")

    # relationship to ticket_md
    ticket_md_id = db.Column(db.Integer, db.ForeignKey('ticket_mds.id'))
    ticket_md = db.relationship("TicketMetaDataModel", backref="raffles")

    def __init__(self, user, ticket_md):
        self.user = user
        self.ticket_md = ticket_md

使用以下示例数据:

id    user_id    ticket_md_id
1     1          1
2     2          1
3     3          1
4     1          2
5     2          2

用户表:

class UserModel(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(25))
    last_name = db.Column(db.String(25))
    won = db.Column(db.Boolean, default=False, nullable=False)

    # has backref via user.raffles

    def __init__(self, first_name, last_name, won):
        self.first_name = first_name
        self.last_name = last_name
        self.won = won

使用以下示例数据:

id    first_name    last_name    won
1     Rob           Stark        False
2     Stan          Clark        False
3     Tom           Dark         False

最后是一个 ticket_mds 表:

class TicketMetaDataModel(db.Model):
    __tablename__ = 'ticket_mds'

    id = db.Column(db.Integer, primary_key=True)
    raffle_type = db.Column(db.String(20))
    description = db.Column(db.String(200))
    modifier = db.Column(db.Integer)

    # has backref via ticket_md.raffles

    def __init__(self, raffle_type, description, modifier):
        self.raffle_type = raffle_type
        self.description = description
        self.modifier = modifier

使用以下示例数据:

id    raffle_type    description    modifier
1     type_1         blah blah      21
2     type_2         blah blah      5

我的问题在于,我似乎无法完全弄清楚一个查询来获取由用户分组的票点总和(基于 TicketMetaDataModel.modifier 属性)莱佛士表以以下格式返回结果:

名字姓氏总点数
例如:

Rob    Stark    26
Stan   Clark    26
Tom    Dark     21

我已尝试以下操作(但无法进一步实现):

query = db.session.query(RaffleModel.id, UserModel.first_name, UserModel.last_name, TicketMetaDataModel.modifier)
query = query.join(UserModel).join(TicketMetaDataModel)
results = query.all()
results equals:

[(1, 'Rob', 'Stark', 21), (2, 'Stan', 'Clark', 21), (3, 'Tom', 'Dark', 21),(4, 'Rob', 'Stark', 5), (5, 'Stan', 'Clark', 5)]

最佳答案

如果我答对了你的问题。您正在尝试按已通过连接获得的值进行分组。

from sqlalchemy import func
query = db.session.query(UserModel.first_name, UserModel.last_name, func.sum(TicketMetaDataModel.modifier))
query = query.join(RaffleModel,RaffleModel.user_id==UserModel.id).join(RaffleModel.ticket_md_id==TicketMetaDataModel.id)
.group_by(UserModel.first_name, UserModel.last_name)

它应该给你所需的结果

关于python - 简单链接表所需的 SQLAlchemy group_by() 求和帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412525/

相关文章:

python - 使用 `iter' 函数会消耗生成器吗?

python - FastAPI - 编写具有多个条件的 REST API 的最佳实践

postgresql - SQLAlchemy 无法连接到本地主机上的 Postgresql

python - BS4 Python : Trying to take page links from Google but the URLs I get are all the same

python - 使用python在Lambda函数中运行命令wirth SSM

python - 覆盖用于测试的 SQLAlchemy 列

python - 主键列在 sqlalchemy 中不会自动递增(IntegrityError)

python-3.x - Sqlalchemy 按计算的日期时间进行过滤 Hybrid_property

python - Flask-SQLAlchemy 设置关系默认值

python - 如何从 Python 中的方法访问函数