pandas DataFrame으로 SQLAlchemy ORM 변환


107

이 주제는 여기 또는 다른 곳에서 한동안 다루지 않았습니다. SQLAlchemy <Query object>를 pandas DataFrame으로 변환하는 솔루션이 있습니까?

Pandas에는 사용할 수있는 기능 pandas.read_sql이 있지만 원시 SQL을 사용해야합니다. 나는 그것을 피하고자하는 두 가지 이유가 있습니다 나는 이미 모든 것을 ORM을 사용하여 (좋은의 그 자체의 이유) 2) 내가 (쿼리의 일환으로 파이썬 목록을 사용하고 있습니다) 1 예 : .db.session.query(Item).filter(Item.symbol.in_(add_symbols)어디에 Item내 모델 클래스 그리고 add_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)queryA는 sqlalchemy.sql.selectable.Select. 그렇지 않으면 'Select' object has no attribute 'session'.
Little Bobby Tables

에 복사 - 붙여 넣기하기 위해, 내가 직접 질문을 다루고 대답에 문서에 링크를 추가 : 사용자가 제공해야 con할 수있는 매개 변수, engine또는connection string

@van 여기서 query.session.connection ()을 사용하는 것이 더 낫습니까? 그렇지 않으면 쿼리는 ... 세션의 계정 unpersisted 변화를 고려하지 않습니다
흐름

1
@dataflow : 나는 당신이 옳다고 생각하지만 나는 가정을 테스트 한 적이 없습니다.
van

@van- 'TypeError : sequence item 0 : expected string, DefaultMeta found'가 발생합니다. 뭐가 잘못 됐는지 알아 내려고 하루 종일 머리를 찢고 있었어요 내가 그림 할 수있는 유일한 방법은 .... 그것이 scoped_session에서 연결을 추출하기 위해 노력하고 함께 할 수있는 뭔가가있을 것입니다
andrewpederson

86

초보 팬더 프로그래머에게 더 명확하게 설명하기 위해 다음은 구체적인 예입니다.

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

여기에서 id = 2 인 불만 사항 테이블 (sqlalchemy 모델은 불만 사항)에서 불만 사항을 선택합니다.


1
코드가 ORM 기반 일 때 이것이 더 명확하다고 생각합니다.
user40780

OMG! 나는 sqlAlchemy 지옥과 많이 고생했습니다. 여기에 참고 사항 : read_sql ( 'SELECT * FROM TABLENAME', db.session.bind)를 작성할 수도 있습니다. 감사. 위의 답변은 받아 들인 것보다 더 많은 도움이되었습니다.
PallavBakshi

3
무엇을 .statement합니까?
cardamom

4
@cardamom은 SQL 쿼리를 반환합니다.
Nuno André

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.