2014-05-20 3 views
0

Le genre suivant est sensible à la casse:tri insensible à la casse avec peewee

MyModel.select().order_by(MyModel.name) 
<class '__main__.MyModel'> SELECT t1."id", t1."name" FROM "mymodel" AS t1 ORDER BY t1."name" [] 

Comment puis-je ajouter un NOCASE pour le rendre insensible à la casse?

Ou y a-t-il un autre moyen de le rendre insensible à la casse?

Je n'ai rien trouvé à ce sujet sur le documentation.

+1

Est-ce que 'MyModel.select(). order_by (fn.Lower (MyModel.name))' fonctionne? Voilà comment cela fonctionne pour SQLAlchemy. –

+0

Pour SQLite, je vois que Peewee supporte aussi les [custom collations] (http://peewee.readthedocs.org/en/latest/peewee/playhouse.html?highlight=collate#sqlite-ext-api-notes), qui devraient être utile ici. –

+0

@MartijnPieters: Oui, cela fonctionne, merci. – stenci

Répondre

2

Vous pouvez utiliser une fonction SQL (avec le fn helper) en minuscules le nom du modèle:

MyModel.select().order_by(fn.Lower(MyModel.name)) 

Pour SQLite, vous devriez être en mesure d'utiliser un custom collation ainsi:

@db.collation() 
def collate_case_insensitive(s1, s2): 
    return cmp(s1.lower(), s2.lower()) 

Le @db.collation() décorateur fourni par le SqliteExtDatabase() subclass vous permet d'enregistrer une fonction de classement personnalisée que vous pouvez ensuite utiliser pour trier par:

MyModel.select().order_by(collate_case_insensitive.collation(MyModel.name)) 

Bien sûr, SQLite a déjà intégré NOCASE collation qui devrait être utilisé ici à la place, mais pour l'utiliser sur doit construire un SQL() object pour inclure la SQL brute:

MyModel.select().order_by(Clause(MyModel.name, SQL('collate NOCASE'))) 

Cela fait écho à la façon dont le cas commande insensible fonctionne pour SQLAlchemy: SQL alchemy case insensitive sort order

+0

Merci. Je comprends enfin ce que sont ces 'fn'. – stenci