คำสั่ง SQLAlchemy ตามการรอคอย?


424

ฉันจะใช้ ORDER BY descendingในแบบสอบถาม SQLAlchemy ดังต่อไปนี้ได้อย่างไร

แบบสอบถามนี้ใช้งานได้ แต่ส่งคืนตามลำดับจากน้อยไปมาก

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

เช่นเดียวกับ FYI คุณสามารถระบุสิ่งเหล่านั้นเป็นแอตทริบิวต์คอลัมน์ได้ เช่นฉันอาจทำ:

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

สิ่งนี้มีประโยชน์เพราะมันหลีกเลี่ยงimportและคุณสามารถใช้มันในที่อื่น ๆ เช่นในการกำหนดความสัมพันธ์ ฯลฯ

สำหรับข้อมูลเพิ่มเติมคุณสามารถอ้างอิงได้


28
ก็ยังหลีกเลี่ยง import
Capi Etheriel

1
มีการอ้างอิง API สำหรับสิ่งนี้หรือไม่จะเจ๋งถ้ารู้ว่ามีอะไรอีกบ้าง
John Mike Mike

ขอบคุณสำหรับสิ่งนี้ ดูเหมือนว่ามันจะหายไปจากเอกสารอย่างเป็นทางการ
user3341078

1
การตอบสนองที่ดีที่สุด (ในขณะนี้)
RodriKing



73

สิ่งหนึ่งที่คุณอาจทำคือ:

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

การใช้ฟังก์ชั่น desc ของ 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)
)
)

สำหรับเอกสารอย่างเป็นทางการโปรดใช้ลิงก์หรือตรวจสอบตัวอย่างด้านล่าง

sqlalchemy.sql.expression.desc (คอลัมน์) ผลิตองค์ประกอบคำสั่งซื้อจากมากไปหาน้อย

เช่น:

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 () เป็นรุ่น Standalone ของเมธอด ColumnElement.desc () ที่มีอยู่ในนิพจน์ SQL ทั้งหมดเช่น:

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

คอลัมน์พารามิเตอร์ - ColumnElement (เช่นนิพจน์ SQL สเกลาร์) ที่จะใช้การดำเนินการ desc ()

ดูสิ่งนี้ด้วย

ASC ()

nullsfirst ()

nullslast ()

Select.order_by ()


5
นี่เป็นวิธีที่ไม่ซ้ำกับstackoverflow.com/a/4187279/2718295 อย่างไร
cowbert

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

สิ่งนี้ไม่จำเป็นต้องมีการตัดสตริงด้วยข้อความ () หรือไม่
Glutexo

ใช้ความระมัดระวังทำให้เกิดข้อผิดพลาดใน SQLAlchemy> 1.3 คำเตือนในรุ่นที่ต่ำกว่า
Checo R
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.