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
3 Réponses :
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
comment cela peut être traduit en api sqlalchemy?
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.
une idée comment implémenter cela dans l'API sqlalchemy?
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) )