SQLAlchemy\'s Query.distinct method is behaving inconsistently:
>>> [tag.name for tag in session.query(Tag).all()]
[u\'Male\', u\'Male\', u\'Ninja\'
According to the docs:
When present, the Postgresql dialect will render a DISTINCT ON (>) construct.
So, passing column expressions to distinct() works for PostgreSQL only (because there is DISTINCT ON).
In the expression session.query(Tag).distinct(Tag.name).count() sqlalchemy ignores Tag.name and produces the query (distinct on all fields):
SELECT DISTINCT tag.country_id AS tag_country_id, tag.name AS tag_name
FROM tag
As you said, in your case distinct(Tag.name) is applied - so instead of just count() consider using this:
session.query(Tag).distinct(Tag.name).group_by(Tag.name).count()
Hope that helps.