1. ホーム
  2. python

[解決済み] SQLAlchemy で SQLite を使って個別の行を返す

2022-01-31 22:11:09

質問

SQLAlchemyの クエリ.distinct メソッドの動作に一貫性がありません。

>>> [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

つまり、2番目の形式は正しい結果を与えますが、1番目の形式はそうではありません。 この現象はSQLiteでは起こるようですが、Postgresでは起こりません。 クエリオブジェクトを渡す関数があります。 distinct 節が適用されるため、上記の2番目の方法ですべてを書き換えることは非常に困難です。 私が見逃している何か明白なものがありますか?

解決方法は?

ドキュメントによると

この場合、Postgresql の方言は DISTINCT ON をレンダリングします。 (>) 構文があります。

そのため、カラムの式を渡すと distinct() はPostgreSQLでのみ動作します(なぜなら、PostgreSQLには DISTINCT ON ).

式中 session.query(Tag).distinct(Tag.name).count() は無視されます。 Tag.name で、クエリ(すべてのフィールドで区別される)を生成します。

SELECT DISTINCT tag.country_id AS tag_country_id, tag.name AS tag_name 
FROM tag

おっしゃるとおり、あなたの場合 distinct(Tag.name) が適用されるため、単なる count() を使用することを検討してください。

session.query(Tag).distinct(Tag.name).group_by(Tag.name).count()

お役に立てれば幸いです。