web-dev-qa-db-fra.com

Conversion SQLAlchemy ORM en pandas DataFrame

Ce sujet n'a pas été abordé depuis un moment, ici ou ailleurs. Existe-t-il une solution permettant de convertir un SQLAlchemy _<Query object>_ en un pandas DataFrame?

Les pandas peuvent utiliser _pandas.read_sql_, mais cela nécessite l’utilisation de SQL brut. J'ai deux raisons de vouloir l'éviter: 1) j'ai déjà tout en utilisant l'ORM (une bonne raison en soi) et 2) j'utilise python liste dans le cadre du requête (par exemple: .db.session.query(Item).filter(Item.symbol.in_(add_symbols)Item est ma classe de modèle et _add_symbols_ est une liste). Ceci est l'équivalent de SQL _SELECT ... from ... WHERE ... IN_.

Est-ce que tout est possible?

86
Jared

Ci-dessous devrait fonctionner dans la plupart des cas:

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

Voir pandas.read_sql documentation pour plus d’informations sur les paramètres.

150
van

Pour que ce soit plus clair pour les novices pandas), voici un exemple concret,

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

Ici, nous sélectionnons une plainte dans la table des plaintes (le modèle sqlalchemy est Plainte) avec id = 2

57
Chandan Purohit

La solution choisie n'a pas fonctionné pour moi, car l'erreur ne cessait de se produire

AttributeError: l'objet 'AnnotatedSelect' n'a pas d'attribut 'inférieur'

J'ai trouvé le travail suivant:

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

Si vous voulez compiler une requête avec des paramètres et des arguments spécifiques au dialecte, utilisez quelque chose comme ceci:

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