SQLAlchemy ĐẶT HÀNG B DESNG CÁCH MẠNG?


424

Làm cách nào tôi có thể sử dụng ORDER BY descendingtrong truy vấn SQLAlchemy như sau?

Truy vấn này hoạt động, nhưng trả về chúng theo thứ tự tăng dần:

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 :)
        )

Nếu tôi cố gắng:

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

sau đó tôi nhận được : NameError: global name 'desc' is not defined.

Câu trả lời:


693

Giống như một FYI, bạn cũng có thể chỉ định những thứ đó như các thuộc tính cột. Ví dụ, tôi có thể đã thực hiện:

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

Điều này rất hữu ích vì nó tránh được importvà bạn có thể sử dụng nó ở những nơi khác như trong định nghĩa quan hệ, v.v.

Để biết thêm thông tin, bạn có thể tham khảo điều này


28
nó cũng tránh một import.
Capi Etheriel

1
Có một tài liệu tham khảo API cho điều này, sẽ rất tuyệt để biết những gì khác có sẵn?
John Mike

Cảm ơn vì điều này. Có vẻ như nó bị thiếu trong tài liệu chính thức.
dùng3341078

1
Phản ứng tốt nhất (tại thời điểm này).
RodriKing

3
@JohnMike docs.sqlalchemy.org/en/latest/core/ Kẻ
dzervas

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

Sử dụng từ @ jpmc26


15
Cách sử dụng: someselect.order_by(desc(table1.mycol))(Lấy từ các tài liệu .) ... bởi vì tôi không nhận thấy điều đó trong câu hỏi của bạn.
jpmc26

1
Tài liệu có một url mới
hughes

73

Một điều khác bạn có thể làm là:

.order_by("name desc")

Điều này sẽ dẫn đến: ĐẶT HÀNG theo tên desc. Nhược điểm ở đây là tên cột rõ ràng được sử dụng theo thứ tự bởi.


25
Đây là một cách giải quyết có khả năng dễ vỡ mà không cần một cách giải quyết.
BlueBomber

13
Điều này thật tuyệt nếu bạn có cột sắp xếp trong một chuỗi vì bất kỳ lý do gì (như đầu vào được khử trùng trong API web).
Jim Stewart

19
Theo dõi, bạn cũng có thể làm getattr(MyModelClass, column_string).desc()nếu bạn có một chuỗi.
Jim Stewart

9
@JimStewart và để đi theo hướng tôi đã kết thúc bằng cách sử dụng:qry.order_by(getattr(getattr(Song, sort_by), sort_dir)())
Tjorriemorrie

1
Bạn cũng có thể sử dụng điều này nếu bạn đã gắn nhãn đầu ra của mình và sắp xếp theo cột được tính thay vì cột mô hình
khiển thuyền

28

Bạn có thể sử dụng .desc()chức năng trong truy vấn của mình như thế này

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

Điều này sẽ sắp xếp theo số lượng theo thứ tự giảm dần hoặc

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

Sử dụng chức năng desc của SQLAlchemy

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)
)
)

Đối với tài liệu chính thức, vui lòng sử dụng liên kết hoặc kiểm tra đoạn dưới đây

sqlalchemy.sql.expression.desc (cột) Tạo phần tử mệnh đề ORDER BY giảm dần.

ví dụ:

from sqlalchemy import desc

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

sẽ tạo SQL dưới dạng:

SELECT id, name FROM user ORDER BY name DESC

Hàm desc () là một phiên bản độc lập của phương thức ColumnEuity.desc () có sẵn trên tất cả các biểu thức SQL, ví dụ:

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

Cột tham số - Cột Cột (ví dụ: biểu thức SQL vô hướng) để áp dụng thao tác desc ().

Xem thêm

Tăng dần()

nullsfirst ()

nullslast ()

Chọn.order_by ()


5
Làm thế nào đây không phải là một bản sao của stackoverflow.com/a/4187279/2718295
cowbert

12

Bạn co thể thử: .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

Bổ sung tại câu trả lời @Radu, Như trong SQL, bạn có thể thêm tên bảng trong tham số nếu bạn có nhiều bảng có cùng thuộc tính.

.order_by("TableName.name desc")

Điều này không yêu cầu gói chuỗi bằng văn bản ()?
Glutexo

Hãy cẩn thận, nó gây ra lỗi trong SQLAlchemy> 1.3, cảnh báo ở các phiên bản thấp hơn
Checo R
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.