Ответ 1
Ниже следует работать в большинстве случаев:
df = pd.read_sql(query.statement, query.session.bind)
Дополнительную информацию о параметрах см. в документации pandas.read_sql
.
Этот вопрос не был рассмотрен через некоторое время, здесь или в другом месте. Есть ли решение, преобразующее SQLAlchemy <Query object>
в pandas DataFrame?
Pandas имеет возможность использовать pandas.read_sql
, но для этого требуется использование raw SQL. У меня есть две причины для того, чтобы избежать этого: 1) У меня уже есть все, используя ORM (хорошая причина сама по себе) и 2) Я использую списки python как часть запроса (например: .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
.
Чтобы сделать это более понятным для начинающих программистов pandas, вот конкретный пример,
pd.read_sql(session.query(Complaint).filter(Complaint.id == 2).statement,session.bind)
Здесь мы выбираем жалобу из таблицы жалоб (модель sqlalchemy - Жалоба) с id = 2
Выбранное решение не сработало для меня, так как я продолжал получать ошибку
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:[email protected]: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)