52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
import asyncio
|
|
|
|
from sqlalchemy import select, func, union
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy.orm import joinedload
|
|
|
|
from backend.session import session_maker
|
|
from models import Deal, DealProduct, Service
|
|
|
|
import models
|
|
import models.secondary
|
|
|
|
|
|
async def main(session: AsyncSession):
|
|
deal_services_subquery = (
|
|
select(
|
|
models.secondary.DealService.deal_id,
|
|
func.sum(models.secondary.DealService.quantity * Service.price).label('total_price')
|
|
)
|
|
.join(Service)
|
|
.group_by(models.secondary.DealService.deal_id)
|
|
)
|
|
product_services_subquery = select(
|
|
select(
|
|
models.secondary.DealProductService.deal_id,
|
|
func.sum(models.DealProduct.quantity * models.secondary.DealProductService.price).label('total_price')
|
|
)
|
|
.join(models.secondary.DealProduct)
|
|
.group_by(models.secondary.DealProductService.deal_id)
|
|
.subquery()
|
|
)
|
|
union_subqueries = deal_services_subquery.union(product_services_subquery).subquery()
|
|
final_subquery = (
|
|
select(
|
|
union_subqueries.c.deal_id,
|
|
func.sum(union_subqueries.c.total_price).label('total_sum')
|
|
)
|
|
.group_by(union_subqueries.c.deal_id)
|
|
.subquery()
|
|
)
|
|
|
|
print(final_subquery)
|
|
|
|
|
|
async def preload():
|
|
async with session_maker() as session:
|
|
await main(session)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(preload())
|