web-dev-qa-db-ja.com

pandas DataFrameへのSQLAlchemy ORM変換

このトピックは、しばらくの間、ここでも他の場所でも対処されていません。 SQLAlchemy <Query object>をpandas DataFrameに変換するソリューションはありますか?

Pandasにはpandas.read_sqlを使用する機能がありますが、これにはraw SQLの使用が必要です。私はそれを避けたい2つの理由があります:1)ORMを使用しているすべてのもの(すでにそれ自体の正当な理由)と2)クエリの一部としてpythonリストを使用しています(例えば:.db.session.query(Item).filter(Item.symbol.in_(add_symbols)ここで、Itemは私のモデルクラスであり、add_symbolsはリストです)。これは、SQL SELECT ... from ... WHERE ... INと同等です。

何か可能ですか?

86
Jared

ほとんどの場合、以下が機能するはずです。

df = pd.read_sql(query.statement, query.session.bind)

パラメーターの詳細については、 pandas.read_sql のドキュメントを参照してください。

150
van

初心者pandasプログラマーにこれをより明確にするために、ここに具体的な例を示します。

pd.read_sql(session.query(Complaint).filter(Complaint.id == 2).statement,session.bind) 

ここでは、id = 2の苦情テーブル(sqlalchemyモデルはComplaint)から苦情を選択します。

57
Chandan Purohit

エラーが発生し続けたため、選択したソリューションは機能しませんでした

AttributeError: 'AnnotatedSelect'オブジェクトには属性 'lower'がありません

私は次のものが働いていることを発見しました:

df = pd.read_sql_query(query.statement, engine)
6
jorr45

パラメータと方言固有の引数を使用してクエリをコンパイルする場合は、次のようなものを使用します。

c = query.statement.compile(query.session.bind)
df = pandas.read_sql(c.string, query.session.bind, params=c.params)
3
Johan Dahlin