2015-04-08 14 views
44

Ten temat nie był już od jakiegoś czasu przedmiotem, tutaj ani w innym miejscu. Czy istnieje rozwiązanie, które przekształca SQLAlchemy <Query object> w pandas DataFrame?Konwersja SQLAlchemy ORM do pand DataFrame

Panda ma możliwość korzystania z pandas.read_sql, ale wymaga to użycia surowego kodu SQL. Mam dwa powody, dla których chcę tego uniknąć: 1) Mam już wszystko za pomocą ORM (dobry powód sam w sobie) i 2) Używam list python jako części zapytania (np. .db.session.query(Item).filter(Item.symbol.in_(add_symbols) gdzie Item jest moim klasa modelu i add_symbols jest listą). Jest to odpowiednik SQL SELECT ... from ... WHERE ... IN.

Czy coś jest możliwe?

Odpowiedz

82

Poniżej powinien działać w większości przypadków:

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

Zobacz pandas.read_sql dokumentację, aby uzyskać więcej informacji na temat parametrów.

+26

Oh. Mój. Bóg. Przebyliśmy długą drogę. – dmvianna

+0

@van +1, ale może zrobić z trochę więcej szczegółów. na przykład Zrobiłem 'df = pd.read_sql (query, query.bind)' gdy 'query' jest' sqlalchemy.sql.selectable.Select'. W przeciwnym razie obiekt '' Wybierz 'nie ma atrybutu "sesja". – josh

+0

W celu skopiowania i wklejenia dodałem link do dokumentacji bezpośrednio w odpowiedzi, która obejmuje twoje pytanie: powinieneś podać parametr 'con', który może być' engine' lub 'ciągiem połączeń' – van

0

Jeśli chcesz skompilować kwerendę z parametrami i konkretnych argumentów dialekcie użyć czegoś takiego:

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

Właśnie zrobić to bardziej jasne dla początkujących pandy programistów, tutaj jest konkretnym przykładem,

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

Tutaj wybieramy skargi na dolegliwości stole (model sqlalchemy jest reklamacji) z id = 2

+0

Myślę, że jest to bardziej jasne, gdy kod jest oparty na technologii ORM. – user40780

+0

OMG! Walczyłem z piekłem sqlAlchemy. Tutaj tylko jedna uwaga: możesz również napisać read_sql ("SELECT * FROM TABLENAME", db.session.bind). Dzięki. Powyższa odpowiedź pomogła mi bardziej niż zaakceptowana. – PallavBakshi

+0

Co robi '.statement'? – cardamom

2

wybrane rozwiązanie nie działa na mnie, jak ja zachowałem get ting błąd

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

znalazłem następujący pracował:

df = pd.read_sql_query(query.statement, engine)