2015-05-04 4 views
1

Это мой flask.SQLAlchemy запрос:Postgres не сортирует правильно

available_subservices = (
    ServicesForOffer.query 
    .filter_by(type=u'Дополнительная') 
    .order_by(ServicesForOffer.name) 
    .all() 
) 

поэтому я распечатать его:

for subs in available_subservices: 
    print subs.name 

и что я вижу:

Доп.створка 
Окно с двойными рамами (2 створки) 
Окно с двойными рамами (3 створки) 
окно с балконной дверью 
Эркер 
Мойка окон 
Мойка окон, уборка кухни, уборка ванной и сан.узла 
мытье холодильника 
балкон 
глажка 
дорога 
Разбор шкафа/антресоли/гардеробной 
Мелкая бытовая техника 
Жалюзи вертикальные 
духовка 

Я не ожидаю, что кто-нибудь узнает порядок кириллицы, но все же вы можете видеть, что капиталы разбросаны по всему, и дорога и духовка являются n ot близко друг к другу. Возможно, что-то вроде Python2 & Юникод?

P.S. когда я сортирую по ServicesForOffer.name.desc() тот же странный порядок воспроизводится, конечно, обратно. Итак, очевидно, что Postgres знает, что я этого не делаю.

ответ

2

Вы, вероятно, не collation установлен правильно, который отвечает за то, как строки сортируются:

Функция сортировки позволяет задать поведение порядок сортировки и классификации символов данных в колонке или даже пер- операция. Это облегчает ограничение невозможности изменения параметров LC_COLLATE и LC_CTYPE в базе данных после его создания.

Вы можете попробовать это, просто выполнив запрос:

schema=> SELECT 'дорога' > 'духовка' COLLATE "en_US"; 
?column? 
---------- 
f 
(1 row) 

или выполнения вашего запроса вручную в PostgreSQL оболочке с:

SELECT ... 
FROM ... 
WHERE ... 
ORDER BY name COLLATE "your collation" 

Если это работает для вас, вы можете просто altering columns collation :

ALTER [ COLUMN ] column [ SET DATA ] TYPE data_type [ COLLATE collation ] 
     [ USING expression ] 
1

У меня был симмил ar с сортировкой MySQL. И решение было:

  • установить DEFAULT CHARACTER SET в схему для 'UTF-8' (по умолчанию было латинским-1) и
  • установить DEFAULT COLLATE в схему с 'utf8_unicode_ci'.

Другой способ - создать правильную схему в вашей базе данных.

Смежные вопросы