#python #sqlalchemy #pyramid
#питон #sqlalchemy #пирамида #python
Вопрос:
Кажется, я не могу найти никакой хорошей документации по этому вопросу. У меня есть список пользователей и суммы заказов, и я хочу отобразить пользователей с 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:
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.
Комментарии:
1. спасибо, одновременно отвечая на вопрос, это также помогло мне понять другие аспекты SQLAlchemy, в отношении которых я сомневался.