0

I am using SqlAlchemy to connect to a postgres database. My goal is to write a simple SELECT * query using the ORM and convert the result to a pandas dataframe.

Within my class, self._pg_client is a Session object, and Matches is a table defined in the data model.

from base import Matches
from pandas import pd

...

class GetData(object):
    def __init__(self, pg_client: Session):
        self._pg_client: Session = pg_client

    def run(self):

        print(type(self._pg_client))
        query = self._pg_client.query(Matches).all()
        print(query.statement)

After instantiating a GetData() object and running it, the first print statement returns:

<class 'sqlalchemy.orm.session.Session'>

as is expected. However the second returns an error:

AttributeError: 'list' object has no attribute 'statement'

query is actually a list object of results from the query, not the query itself. A few other posts have suggested passing the query statement (link, link) to read_sql(), but I cannot seem to get the statment itself. I try the following:

matches = pd.read_sql(self._pg_client.query(Matches).all().statement, self._pg_client.bind)

which fails because the list object does not have a statement attribute. What is the correct way to get the query statement from an ORM query in SQLalchemy? Is this all that is needed to pass to read_sql ?

iskandarblue
  • 7,208
  • 15
  • 60
  • 130
  • 1
    `Query.all()` executes and returns a list, so don't call it, if you want the `Query` object itself. – Ilja Everilä Apr 07 '21 at 06:44
  • 1
    As @IljaEverilä pointed out: `query = self._pg_client.query(Matches); print(query)` before you do `results = query.all()` – van Apr 07 '21 at 11:40

0 Answers0