2013-01-16 11 views
5

Teraz sortuję dane w bazie danych według ich atrybutu 1. Jeśli występuje remis różnych pozycji o tej samej wartości atrybutu 1, dane wydają się posortowane według ich identyfikatora. Jednak chciałbym zerwać remis przez sortowanie według desc (id). Jak mogę zmienić domyślne kryteria sortowania bazy danych, jeśli istnieje remis?Domyślne kryteria sortowania sqlalchemy?

Dzięki!

Odpowiedz

7

Zamówienie jest w całości określane przez bazę danych, a nie przez SQLAlchemy. Z prostym SQLem dodajesz dodatkowe klauzule ORDER BY, w SQLAlchemy ORM robisz to samo, łącząc metody order_by. Na przykład:

for eq in session.query(Equipment).order_by(Equipment.model_id).order_by(Equipment.name).all(): 
    print (eq) 

Niezależnie od tego, która z nich jest najbardziej podstawowa.

+1

BTW, jak sortować * DESC * z SQLAlchemy zostanie udzielona odpowiedź [to pytanie] (http://stackoverflow.com/q/4186062/851737). – schlamar

+0

Wielkie dzięki, to jest pomocne !! – user1909371

8

Przynajmniej w SQLAlchemy v0.9.8 jest to możliwe za pomocą mapper configuration.

Jeśli masz tabelę użytkownikiem i chcesz pobierać rekordy zawsze zamówione przez fullname Coś jak to powinno działa:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 

Base = declarative_base() 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 

    __mapper_args__ = { 
     "order_by":fullname 
    } 

    def __repr__(self): 
     return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password) 
+1

Dodanie domyślnej kolejności w konfiguracji odwzorowania zostało wycofane od wersji 1.1 na rzecz jawnego użycia 'Query.order_by()'. –

Powiązane problemy