Добавить сортировку при выборке из Бд - SQLAlchemy
Я не знаком с пайтоном и тем более с SQLAlchemy. Один паренек написал нам код и пропал, а нам надо добавить сортировку в запрос. В классе CRUD, вот в этот метод:
@staticmethod
def get_distinct_column(db_session: Session, column: str) -> List[dict]:
# city, partner_id, site
ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').all()
return [u._asdict() for u in ds]
Я пытался сделать так:
ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(f"{column}").all()
Не работает. Прошу помощи. также есть такие фрагменты:
class OrdersTable(Base):
"""Model user"""
__tablename__ = 'orders'
__table_args__ = {'autoload': True}
и вызов метода :
@app.get('/params/{column}', response_model=List[schemas.Parems], summary='Получение параметров', tags=["Analytic"])
async def get_params(column: str, db: Session = Depends(get_db), user=Depends(user_fastapi.current_user(active=True))):
data_params = crud_orders.get_distinct_column(db, column)
items = []
for item in data_params:
for key, value in item.items():
items.append(schemas.Parems(key=key, value=value).dict())
return [dict(s) for s in set(frozenset(d.items()) for d in items)]
УПД сделал в методе get_distinct_column:
ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(getattr(OrdersTable, column)).all()
работает, но порядка нет, хотя он и стал другим. потом сделал в main.py в методе async def get_params:
return [dict(s) for s in (frozenset(d.items()) for d in items)]
убрал set перестало работать совсем
Ответы (2 шт):
order_by на вход принимает сами атрибуты класса, привязанные к колонкам таблицы. А вы пытаетесь передать строку с названием колонки. Для получения объекта самого атрибута используйте подход автора функции - getattr(OrdersTable, column)
ds = db_session.query(getattr(OrdersTable, column)).distinct().filter(getattr(OrdersTable, column) != '').order_by(getattr(OrdersTable, column)).all()
Для лучшей читаемости можно так
@staticmethod
def get_distinct_column(db_session: Session, column: str) -> List[dict]:
# city, partner_id, site
selected_column = getattr(OrdersTable, column)
ds = db_session.query(selected_column).distinct().filter(selected_column != '').order_by(selected_column).all()
return [u._asdict() for u in ds]
Вы добавили ещё код. Там порядок и ломается. Не буду вникать в целесообразность всей конструкции, но для восстановления порядка попробуйте это
return [dict(s) for s in set(frozenset(d.items()) for d in items)]
Поменять на это
return [dict(s) for s in (frozenset(d.items()) for d in items)]
вобщем ларчик просто открывался:
заменил return в async def get_params
вместо
return [dict(s) for s in (frozenset(d.items()) for d in items)]
просто
return items
и - о, чудо, всё стало как надо.
Спасибо огромное господину Alpensin, за то, что вдохновил на поиски решения.