1
votes

Clause de commande avec commande explicite

J'ai une ligne avec trois résultats possibles

.order_by(Survey.rating).all()      

Je souhaite conserver cet ordre. Desc ou ASC ne correspondra pas. Alors, il y a un moyen de spécifier quelle est la commande attendue?

Je ne sais pas si c'est pertinent, mais j'utilise l'alchimie SQL.

no 
neutral
yes


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser une expression de cas pour contrôler l'ordre lorsqu'il n'y a pas de séquence naturelle pour le faire.

order by case col1 when 'no' then 1 when 'neutral' then 2 else 3 end


1 commentaires

comment cela peut être traduit en api sqlalchemy?



2
votes

Les tableaux peuvent être pratiques pour ce type de logique dans Postgres. Une méthode est:

array_position(array['no', 'neutral', 'yes'], colname)

Ceci est pratique car il est facile d’étendre à plus de valeurs.


1 commentaires

une idée comment implémenter cela dans l'API sqlalchemy?



0
votes

Pour l'API sqlalchemy, nous pouvons utiliser 'func'

from sqlalchemy import cast, Text

.order_by(func.array_position(array['no', 'neutral', 'yes'], cast(table.c.colname, Text)) ) 

Mais nous devons également vérifier le type de cast pour colname , b / c nous devons indiquer le type de données de un élément explicitement (sqlalchemy a une fonction cast pour cela).

Ensuite en indiquant le type, nous aurons ce qui suit:

from sqlalchemy import func

.order_by(func.array_position(array['no', 'neutral', 'yes'], colname) ) 


0 commentaires