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)
où 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?
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.
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
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)
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)