запрос нескольких SQLalchemy ORM - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в SQLalchemy. Мне нужно вычислить кратное несколько price в одной из таблиц. Это мои таблицы:

class Order(DeclarativeBase):
    __tablename__ = 'order'
    id = Field(Integer, primary_key=True)
    products = relationship("OrderProduct", back_populates="order", lazy='dynamic')

и

class OrderProduct(DeclarativeBase):
    __tablename__ = 'order_products'
    id = Field(Integer, primary_key=True)
    order_id = Column(Integer, ForeignKey('order.id'), nullable=False)
    order = relationship("Order", back_populates="products", protected=True)
    product_id = Column(Integer, ForeignKey('product.id'), nullable=False)
    product = relationship("Product", back_populates="order_product")
    quantity = Field(Integer, nullable=False)

и

class Product(DeclarativeBase):
    __tablename__ = 'product'
    id = Field(Integer, primary_key=True)
    price = Field(Integer)
    order_product = relationship("OrderProduct", back_populates="product", protected=True)

Я хочу умножить price в этой ситуации OrderProduct.quantity * Product.price и products в Order таблица представляет собой массив Products

Я пишу SQL запрос, как это, и он работает:

SELECT SUM(price*quantity) FROM product
JOIN order_products ON product.id = order_products.product_id 
JOIN order ON order_products.order_id = order.id;

Я попытался сделать это в ORM, как это, но это заняло у меня Product, и я могу вычислить только price без кратного в quantity:

    result = 0
        for product in Product.query\
            .join(OrderProduct).filter(Product.id == OrderProduct.product_id)\
            .join(Order).filter(OrderProduct.order_id == self.id):
        result = product.price + result
    return result

Я делаю это как @hybrid_property, и он хорошо работает.

Я использую фреймворк с именем restfulpy. он имеет ORM для sqlalchemy, session в этом фреймворке равен scoped_session, но он дает мне SQL-запрос в режиме отладки вместо того, чтобы выполнять запрос следующим образом:

sum_price = {Query}SELECT sum(product.price * order_products.quantity) AS sum_1 
FROM product JOIN order_products ON product.id = order_products.product_id JOIN "order" ON "order".id = order_products.order_id 
WHERE product.id = order_products.product_id AND order_products.order_id = :order_id_1

Ну, может кто-нибудь помочь мне решить эту проблему?

с уважением

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Я только что понял, что SQLalchemy - отличный ORM! Если у вас есть связь между двумя, тремя или ... таблицами, SQLalchemy создает соединение между ними, и вы просто запрашиваете его!

Я сделал это для себя и своих друзей :) SQLalchemy сильнее, чем я думаю!

Это правильный ответ:

@hybrid_property
def total_price(self):

return DBSession.query(
        func.sum(Product.price * OrderProduct.quantity))\
        .filter(OrderProduct.product_id == Product.id) \
        .filter(OrderProduct.order_id == self.id).scalar()

DBSession то же самое с session

0 голосов
/ 30 апреля 2018
from sqlalchemy import func
query = session.query(func.sum(Product.price*OrderProduct.quantity))
               .join(OrderProduct).filter(Product.id == OrderProduct.product_id)
               .join(Order).filter(OrderProduct.order_id == self.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...