2011-09-16 28 views
6

Tôi đang cố gắng sắp xếp một đối tượng ORM SQLAlchemy theo một trường, nhưng với một thứ tự cụ thể của các giá trị (mà không phải là tăng dần hoặc giảm dần). Nếu tôi đã thực hiện truy vấn này trên MySQL, nó sẽ giống như;SQLAlchemy ORDER BY FIELD()

SELECT letter FROM alphabet_table WHERE letter in ('g','a','c','k') 
ORDER BY FIELDS(letter, 'g','a','c','k'); 

cho kết quả:

letter 
------ 
    g 
    a 
    c 
    k 

Đối với SQLAlchemy, tôi đã cố gắng điều dọc theo dòng:

session.query (AlphabetTable) .filter (AlphabetTable.letter.in_ (('g', 'a', 'c', 'k'))). order_by (AlphabetTable.letter.in _ (('g', 'a', 'c', 'k')))

Điều gì không hoạt động ... bất kỳ ý tưởng nào? Đó là một danh sách liên tục một lần nhỏ và tôi có thể tạo một bảng với thứ tự và sau đó tham gia, nhưng điều đó có vẻ hơi quá nhiều.

+0

Can bạn gọi một thủ tục lưu trữ mysql từ sqlalchemy? – Louis

Trả lời

7

Điều này có thể không phải là một giải pháp rất thỏa mãn, nhưng làm thế nào về việc sử dụng một case expression thay vì order by fields:

sqlalchemy.orm.Query(AlphabetTable) \ 
    .filter(AlphabetTable.letter.in_("gack")) \ 
    .order_by(sqlalchemy.sql.expression.case(((AlphabetTable.letter == "g", 1), 
               (AlphabetTable.letter == "a", 2), 
               (AlphabetTable.letter == "c", 3), 
               (AlphabetTable.letter == "k", 4)))) 
8

Một SQLAlchemy func expression thể được sử dụng để tạo ra các order by field khoản:

session.query(AlphabetTable) \ 
    .filter(AlphabetTable.letter.in_("gack")) \ 
    .order_by(sqlalchemy.func.field(AlphabetTable.letter, *"gack")) 
Các vấn đề liên quan