2017-11-01 141 views
0

SQLAlchemyのcollect_setの動作をシミュレートしたい(MySQLコネクタを使用)。グループA 1,2,32,1,3と同じである。重複が発生する可能性がありますので、SQLAlchemyのは、グループ内の値を注文しないデフォルトでは、しかしSQLAlchemy group_concat順序付けされた値

res = db.session \ 
    .query(T1.col1.label('col1'), func.group_concat(T1.col2.distinct()).label('col2_group')) \ 
    .group_by(T1.col1) \ 
    .all() 

:私は、次のコードを持っています。

collect_setの動作をシミュレートする方法はありますか?

+0

のようなものにコンパイル思われるデフォルトのMySQLで」という意味ではありません。ご注文はありませんグループ内の値 "?問題のDBを質問とタグに適切に追加してください。 –

答えて

1

残念ながら、SQLAlchemyには公式aggregate ORDER BY support for Postgresql onlyがあります。あなたはまだ少しhackishlyものの、generic op()オペレータの機能を使用して他の方言でそれを表現することができます

func.group_concat(T1.col2.distinct().op("ORDER BY")(T1.col2)) 

group_concat(DISTINCT t1.col2 ORDER BY t1.col2) 
+0

ありがとう、残念ながら私はMySQLを使用しています。 – Den1al

+0

解決策は、PostgreSQL以外の*方言のためのものであり、したがってhackishnessです。 'func.string_agg(aggregate_order_by(T.col.distinct()、T.col))')と同じようにPostgresqlにも同じように表現します。 GROUP_CONCATをカスタム[登録された関数](http://docs.sqlalchemy.org/en/latest/core/functions.html#sqlalchemy.sql.functions.GenericFunction)およびそのためのコンパイラとして実装することもできます。 –

+0

さて、string_aggの引数が間違っていますが、その点は依然として立っています。 –

関連する問題