Преобразование SQLAlchemy ORM в фрейм данных pandas


эта тема не рассматривалась в то время, здесь или в другом месте. Есть ли решение, преобразующее SQLAlchemy <Query object> в панды фрейма данных?

панды имеет возможность использовать pandas.read_sql но это требует использования необработанного SQL. У меня есть две причины, чтобы избежать этого: 1) у меня уже есть все, используя ORM (хорошая причина сама по себе) и 2) я использую списки python как часть запроса (например: .db.session.query(Item).filter(Item.symbol.in_(add_symbols) здесь Item Это мой класс модели и add_symbols список). Это эквивалент SQL SELECT ... from ... WHERE ... IN.

возможно ли что-нибудь?

4 59

4 ответа:

ниже должно работать в большинстве случаев:

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) 

здесь мы выбираем жалобу из таблицы жалоб (модель 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)