Как отсортировать union запрос, используя coalesce (sqlalchemy)
Мой код:
@router.get('/{to_user_id}')
async def message_get(to_user_id: int, session: AsyncSession = Depends(get_async_session),
current_user=Depends(get_current_user)):
subquery1 = select(Message).where(Message.user_id == current_user.id).where(Message.to_user_id == to_user_id)
subquery2 = select(Message).where(Message.user_id == to_user_id).where(Message.to_user_id == current_user.id)
union_query = union_all(subquery1, subquery2).order_by(desc(coalesce(Message.data_updated, Message.data_send)))
result = await session.execute(union_query)
return {'status': 200, 'data': result.all()}
код ошибки:
sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) <class 'asyncpg.exceptions.FeatureNotSupportedError'>: неверное предложение UNION/INTERSECT/EXCEPT ORDER BY
DETAIL: Допустимо использование только имён столбцов, но не выражений или функций.
HINT: Добавьте выражение/функцию в каждый SELECT или перенесите UNION в предложение FROM.
[SQL: SELECT message.id, message.user_id, message.to_user_id, message.content, message.data_send, message.data_updated
FROM message
WHERE message.user_id = $1::INTEGER AND message.to_user_id = $2::INTEGER UNION ALL SELECT message.id, message.user_id, message.to_user_id, message.content, message.data_send, message.data_updated
FROM message
WHERE message.user_id = $3::INTEGER AND message.to_user_id = $4::INTEGER ORDER BY coalesce(data_updated, data_send) DESC]
[parameters: (2, 1, 1, 2)]
Я хочу отсортировать диалог юзеров по дате, но data_updated по дефолту null. Не могу решить эту проблему уже долгое время, не особо силен в sqlaclhemy( Как я могу решить эту проблему? Мне не обязательно использовать union, просто это лучшее, что я нашел