Группировка итогов в SQLAlchemy - PullRequest
3 голосов
/ 25 октября 2011

Не могу найти хорошую документацию по этому вопросу.У меня есть список пользователей и суммы заказов, и я хочу отобразить пользователей с итоговыми 10 суммами заказов.У меня возникли проблемы при создании запроса, который в достаточной степени извлекает эти данные в SQLAlchemy.Есть ли лучший способ приблизиться к этому?

customers, amount = DBSession.query(Order.customer, func.sum(Order.amount).label('totalamount')).\
    group_by(Order.customer).\
    order_by(func.desc(totalamount)).\
    limit(10)

for a, b in zip(customers, amount):
    print a.name, str(amount)

1 Ответ

4 голосов
/ 25 октября 2011
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
import random

Base= declarative_base()

class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode)
    orders = relationship("Order", backref="customer")

class Order(Base):
    __tablename__ = "order"

    id = Column(Integer, primary_key=True)
    customer_id= Column(Integer, ForeignKey('customer.id'))
    amount = Column(Integer)

e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

session = Session(e)

session.add_all([
    Customer(name="c%d" % i, orders=[
        Order(amount=random.randint(10, 100))
        for j in xrange(random.randint(0, 5))
    ])
    for i in xrange(100)
])

amount_sum = func.sum(Order.amount).label('totalamount')
amount = session.query(Order.customer_id, amount_sum).\
            group_by(Order.customer_id).\
            order_by(amount_sum.desc()).\
            limit(10).\
            subquery()

for a, b in session.query(Customer, amount.c.totalamount).\
    join(amount, amount.c.customer_id==Customer.id):
    print a.name, b

некоторые рекомендации по шаблону здесь приведены на http://www.sqlalchemy.org/docs/orm/tutorial.html#using-subqueries,, но в целом сначала запускаются в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...