Le retour des lignes distinctes dans SQLAlchemy avec SQLite
SQLAlchemy de De la requête.distinctes méthode est de se comporter de façon incohérente:
>>> [tag.name for tag in session.query(Tag).all()]
[u'Male', u'Male', u'Ninja', u'Pirate']
>>> session.query(Tag).distinct(Tag.name).count()
4
>>> session.query(Tag.name).distinct().count()
3
De sorte que la deuxième forme donne le résultat correct, mais la première forme ne fonctionne pas. Cela semble se produire avec SQLite, mais PAS avec Postgres. J'ai une fonction qui est passé d'un objet de requête pour avoir un distinct
clause est appliquée, de sorte qu'il serait très difficile de réécrire tout le haut utiliser la deuxième méthode ci-dessus. Il est évident que je suis absent?
Vous devez vous connecter pour publier un commentaire.
Selon les docs:
Donc, en passant colonne expressions de
distinct()
fonctionne pour PostgreSQL seulement (car il yDISTINCT ON
).Dans l'expression
session.query(Tag).distinct(Tag.name).count()
sqlalchemy ignoreTag.name
et produit de la requête (distinct sur l'ensemble des champs):Comme vous l'avez dit, dans votre cas
distinct(Tag.name)
est appliquée - donc au lieu de simplementcount()
envisager d'utiliser cela:Espère que ça aide.
DISTINCT ON
mais depuis que les docs n'ont pas explicitement dire "et c'est la seule façon que cela fonctionne" ou quelque chose comme ça, je ne savais pas que c'était implicite.count()
, mais de corriger les solutions existent, comme dans l'autre réponse).distinct(Tag.name)
tout à fait, parce que c'est inutile dans SQLite, et la requête qu'il sera rejeté par la plupart SQL SGBD du fait du regroupement. Sur la double dv, je fais partager des liens intéressants q/a (d'une façon ou de l'autre). Ce serait sympa de faire une dupe cible, si ce n'est pour la accepté de répondre, si vous avez bien expliquer pourquoidistinct()
accepte même des expressions comme args.Lorsque vous utilisez
session.query(Tag)
vous toujours requête pour l'ensemble de laTag
objet, donc si votre table contient des colonnes autre, ça ne marchera pas.Nous allons supposer qu'il y a un
id
colonne, alors la requêteproduira:
L'argument de la clause distinct est complètement ignoré.
Si vraiment vous ne voulez les différents noms de la table, vous devez sélectionner uniquement les noms:
produit: