Sortowanie danych w MySQL i Django

Każda baza danych ma swoje specyficzne funkcjonalności, które dość często mogą okazać się przydatne. Zdarza się że liczby przechowujemy w polach tekstowych (VARCHAR) jako pole models.CharField. Sortowanie tego pola nie pozwoli na poprawne sortowanie liczb. Np efekt będzie taki.
1
10
100
101
102
103
104
105
106
107
108
109
11
Jeżeli stosujemy MySQL to by posortować takie dane numerycznie wystarczy prosta sztuczka. Zamiast:
ORDER BY kolumna
Należy zastosować:
ORDER BY (kolumna+0)
W Django zwykłe sortowanie to nie problem:
data = Row.objects.all().order_by('cell3')
for i in data:
	print i.cell3
Żeby zastosować powyższą sztuczkę nie trzeba pisać zapytania w czystym SQLu. Wystarczy wykorzystać metodę extra ORMa:
data = Row.objects.all()
data = data.extra(select={'sortuj_numerycznie': '(cell3+0)'})
data = data.extra(order_by=['sortuj_numerycznie'])

for i in data:
	print i.cell3


Innym problemem jaki może się pojawić to błędne sortowanie polskich liter w sortowaniu napisowym. W przypadku MySQL oznacza to brak ustawionego polskiego zestawu znaków:
ALTER TABLE tabela CONVERT TO CHARACTER SET UTF8 COLLATE utf8_polish_ci;
RkBlog

Django, 7 January 2010

Comment article
Comment article RkBlog main page Search RSS Contact