이 주제는 여기 또는 다른 곳에서 한동안 다루지 않았습니다. 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
합니다.
가능한 것이 있습니까?
답변
다음은 대부분의 경우 작동합니다.
df = pd.read_sql(query.statement, query.session.bind)
pandas.read_sql
매개 변수에 대한 자세한 정보는 문서를 참조하십시오 .
답변
초보 팬더 프로그래머에게 더 명확하게 설명하기 위해 다음은 구체적인 예입니다.
pd.read_sql(session.query(Complaint).filter(Complaint.id == 2).statement,session.bind)
여기에서 id = 2 인 불만 사항 테이블 (sqlalchemy 모델은 불만 사항)에서 불만 사항을 선택합니다.
답변
계속 오류가 발생하여 선택한 솔루션이 작동하지 않았습니다.
AttributeError : ‘AnnotatedSelect’개체에 ‘lower’속성이 없습니다.
다음이 효과가 있음을 알았습니다.
df = pd.read_sql_query(query.statement, engine)
답변
매개 변수와 방언 특정 인수로 쿼리를 컴파일하려면 다음과 같이 사용하십시오.
c = query.statement.compile(query.session.bind)
df = pandas.read_sql(c.string, query.session.bind, params=c.params)
답변
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)