2015-04-08 3 views
44

Этот вопрос не был рассмотрен через некоторое время, здесь или в другом месте. Есть ли решение, преобразующее SQLAlchemy <Query object> в pandas DataFrame?SQLAlchemy ORM преобразование в pandas DataFrame

У Pandas есть возможность использовать 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.

Есть ли что-нибудь еще?

ответ

82

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

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

См pandas.read_sql документации для получения дополнительной информации о параметрах.

+26

О. Мои. Бог. Мы прошли долгий путь. – dmvianna

+0

@van +1, но он мог бы сделать немного более подробно. например Я сделал 'df = pd.read_sql (query, query.bind)', когда 'query' является' sqlalchemy.sql.selectable.Select'. В противном случае, я получил '' Select 'объект не имеет атрибута' session''. – josh

+0

Чтобы скопировать-вставить, я добавил ссылку на документацию непосредственно в ответе, в которой указан ваш вопрос: вы должны указать параметр 'con', который может быть строкой' engine' или 'connection – van

0

Если вы хотите скомпилировать запрос с параметрами и диалектных конкретных аргументов, использовать что-то вроде этого:

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

Просто чтобы сделать это более понятным для начинающих панд программистов, вот конкретный пример,

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

Здесь мы выбираем жалобу из таблицы жалоб (SQLAlchemy модель жалобы) с идентификатором = 2

+0

Я думаю, что это более понятно, когда код основан на ORM. – user40780

+0

OMG! Я много боролся с sqlAlchemy ад. Просто обратите внимание: вы также можете написать read_sql ('SELECT * FROM TABLENAME', db.session.bind). Благодарю. Вышеупомянутый ответ помог мне больше, чем принятый. – PallavBakshi

+0

Что делает '.statement'? – cardamom

2

Выбранное решение не работает для меня, так как я все прибудете тин ошибка

AttributeError: 'AnnotatedSelect' object has no attribute 'lower'

я нашел следующее работал:

df = pd.read_sql_query(query.statement, engine) 
Смежные вопросы