SQLAlchemy 주문에 의한 주문?


424

descending다음과 같은 SQLAlchemy 쿼리에서 ORDER BY 를 어떻게 사용할 수 있습니까?

이 쿼리는 작동하지만 오름차순으로 반환합니다.

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount) # This row :)
        )

내가 시도하면 :

.order_by(desc(model.Entry.amount))

그때 나는 얻는다 : NameError: global name 'desc' is not defined.

답변:


692

참고로, 항목을 열 속성으로 지정할 수도 있습니다. 예를 들어, 다음을 수행했을 수 있습니다.

.order_by(model.Entry.amount.desc())

이것은 피하기 때문에 편리합니다 import 하며 관계 정의 등의 다른 위치에서 사용할 수 있습니다.

자세한 내용은 다음을 참조하십시오


28
또한 피합니다 import.
Capi Etheriel

1
이것에 대한 API 참조가 있습니까? 사용 가능한 다른 것을 아는 것이 좋을까요?
John Mike

이것에 감사드립니다. 공식 문서에서 누락 된 것 같습니다.
user3341078

1
가장 좋은 답변입니다 (현재).
RodriKing


338
from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

@ jpmc26의 사용법


15
사용법 : someselect.order_by(desc(table1.mycol))( 문서 에서 가져온 입니다.) ... 귀하의 질문에서 그것을 알지 못했기 때문입니다.
jpmc26

1
문서는이 새로운 URL
휴즈

73

당신이 할 수있는 또 하나의 일은 :

.order_by("name desc")

결과 : ORDER BY name desc. 여기서 단점은 순서대로 사용되는 명시 적 열 이름입니다.


25
해결 방법이 필요하지 않은 잠재적으로 취하기 쉬운 해결 방법입니다.
BlueBomber

13
그래도 웹 API의 위생 처리 된 입력과 같이 어떤 이유로 든 문자열에 정렬 열이있는 경우 좋습니다.
Jim Stewart

19
후속 조치 getattr(MyModelClass, column_string).desc()로 문자열 이 있으면 할 수도 있습니다 .
Jim Stewart

9
@ JimStewart 그리고 방향으로 전달하기 위해 나는 다음을 사용하여 끝났다 :qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
당신이 당신의 출력을 표시하고 대신 모델 열의 계산 열을 기준으로 정렬되는 경우에도이 사용할 수 있습니다
boatcoder

28

.desc()이처럼 쿼리에서 함수를 사용할 수 있습니다

query = (model.Session.query(model.Entry)
        .join(model.ClassificationItem)
        .join(model.EnumerationValue)
        .filter_by(id=c.row.id)
        .order_by(model.Entry.amount.desc())
        )

내림차순으로 금액별로 주문하거나

query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    model.Entry.amount.desc()
)
)

SQLAlchemy의 desc 기능 사용

from sqlalchemy import desc
query = session.query(
    model.Entry
).join(
    model.ClassificationItem
).join(
    model.EnumerationValue
).filter_by(
    id=c.row.id
).order_by(
    desc(model.Entry.amount)
)
)

공식 문서의 경우 링크 하거나 아래 스 니펫을 확인하십시오.

sqlalchemy.sql.expression.desc (column) 내림차순 ORDER BY 절 요소를 생성합니다.

예 :

from sqlalchemy import desc

stmt = select([users_table]).order_by(desc(users_table.c.name))

다음과 같이 SQL을 생성합니다.

SELECT id, name FROM user ORDER BY name DESC

desc () 함수는 모든 SQL 표현식에서 사용할 수있는 독립형 버전의 ColumnElement.desc () 메소드입니다.

stmt = select([users_table]).order_by(users_table.c.name.desc())

매개 변수 column – desc () 작업을 적용 할 ColumnElement (예 : 스칼라 SQL 식)입니다.

또한보십시오

asc ()

nullsfirst ()

nullslast ()

Select.order_by ()



12

당신은 시도 할 수 있습니다: .order_by(ClientTotal.id.desc())

session = Session()
auth_client_name = 'client3' 
result_by_auth_client = session.query(ClientTotal).filter(ClientTotal.client ==
auth_client_name).order_by(ClientTotal.id.desc()).all()

for rbac in result_by_auth_client:
    print(rbac.id) 
session.close()

0

@Radu의 보완 답변, SQL에서와 같이 동일한 속성을 가진 테이블이 많은 경우 매개 변수에 테이블 이름을 추가 할 수 있습니다.

.order_by("TableName.name desc")

이 경우 문자열을 text ()로 줄 바꿈해야합니까?
Glutexo

SQLAlchemy> 1.3에서 오류가 발생하도록주의하십시오. 하위 버전에서는 경고입니다
Checo R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.