SQLAlchemy ORMからpandas DataFrameへの変換


107

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

パンダには使用する機能がありますpandas.read_sqlが、これには生のSQLを使用する必要があります。私はそれを回避したい2つの理由があります:1)ORMを使用してすべてを既に持っています(それ自体に正当な理由)および2)クエリの一部としてpythonリストを使用しています(例:モデルクラスは.db.session.query(Item).filter(Item.symbol.in_(add_symbols)どこですか)Itemadd_symbolsリストです)。これはSQLに相当しますSELECT ... from ... WHERE ... IN

何か可能ですか?

回答:


192

以下はほとんどの場合に機能するはずです:

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

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


@van +1ですが、もう少し詳しく説明できます。例えば私がやったdf = pd.read_sql(query, query.bind)ときqueryですsqlalchemy.sql.selectable.Select。そうでなければ、私は得た'Select' object has no attribute 'session'
リトルボビーテーブル

コピー&ペーストするためには、私はあなたの質問をカバー答え、直接ドキュメントへのリンクを追加しました:あなたは提供する必要がありますconすることができ、パラメータ、engineまたはconnection string
バン

@vanここでquery.session.connection()を使用する方が良いでしょうか?そうでない場合、クエリはセッション内の永続的でない変更を考慮しません...
データフロー2017年

1
@dataflow:私はあなたが正しいと思いますが、私は仮定をテストしたことがありません。
ファン

@van-これは「TypeError:シーケンス項目0:期待される文字列、DefaultMetaが見つかりました」をスローします。何が悪いのかを理解しようとして一日中髪をちぎりました。私が理解できることは、scoped_sessionから接続を抽出しようとすることと関係があるかもしれないということだけです...
andrewpederson

85

初心者のパンダプログラマのためにこれをより明確にするために、ここに具体例を示します。

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

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


1
コードがORMベースの場合、これはより明確になると思います。
user40780 2017

ああ、神様!私はsqlAlchemyの地獄と非常に苦労しました。ここでちょっと注意してください:read_sql( 'SELECT * FROM TABLENAME'、db.session.bind)と書くこともできます。ありがとう。上記の答えは、受け入れられたものよりも私を助けました。
PallavBakshi

3
何をし.statementますか?
カルダモン

4
@cardamomはSQLクエリを返します。
ヌーノ・アンドレ

10

何度もエラーが発生するため、選択したソリューションはうまくいきませんでした

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

私は以下がうまくいったことを発見しました:

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

4

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

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

3
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('postgresql://postgres:postgres@localhost:5432/DB', echo=False)
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()

conn = session.bind

class DailyTrendsTable(Base):

    __tablename__ = 'trends'
    __table_args__ = ({"schema": 'mf_analysis'})

    company_code = Column(DOUBLE_PRECISION, primary_key=True)
    rt_bullish_trending = Column(Integer)
    rt_bearish_trending = Column(Integer)
    rt_bullish_non_trending = Column(Integer)
    rt_bearish_non_trending = Column(Integer)
    gen_date = Column(Date, primary_key=True)

df_query = select([DailyTrendsTable])

df_data = pd.read_sql(rt_daily_query, con = conn)

輸入selectではdf_query = select([DailyTrendsTable])不足しています。from sqlalchemy import select
Carlos Azevedo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.