SQLAlchemy - L'oggetto "Tabella" non ha l'attributo "_query_cls" quando si esegue una query su una tabella ottenuta con riflettere

Aug 21 2020

Sto cercando di interrogare una tabella con SQL Alchemy ORM a cui mi sono connesso reflect(è un database esistente). Ho provato a utilizzare il metodo descritto qui: Come interrogare una tabella, in sqlalchemy per interrogare i dati ma ho ricevuto un errore.

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import Session

engine = create_engine(db_uri)
metadata = MetaData(engine)
metadata.reflect()
table = metadata.tables["events"]
Session.query(table).all()

Ottengo il seguente errore:

Traceback (most recent call last):
  File "/home/nicolas/anaconda3/envs/chatbot_analytics/lib/python3.8/site-packages/IPython/core/interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-25-bed7e1c6ef62>", line 1, in <module>
    Session.query(tu).first()
  File "/home/nicolas/anaconda3/envs/chatbot_analytics/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 1584, in query
    return self._query_cls(entities, self, **kwargs)
AttributeError: 'Table' object has no attribute '_query_cls'

Uso la versione SQLAlchemy==1.3.19. Uso un database PostgreSQL.

È possibile interrogare i dati con l'ORM quando si ottiene la tabella in questo modo?

Risposte

2 IljaEverilä Aug 21 2020 at 16:52

In

Session.query(table)

non stai chiamando un metodo di Sessionun'istanza, ma stai passando l' Tableoggetto come selfargomento, perché Sessionè la classe, non un'istanza. Il modo usuale per creare una sessione preconfigurata consiste nell'usare sessionmakerper creare una versione su misura della Sessionclasse, e quindi istanziarla:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import sessionmaker

engine = create_engine(db_uri)
metadata = MetaData(engine)
metadata.reflect()
table = metadata.tables["events"]
Session = sessionmaker(bind=engine)
session = Session()
session.query(table).all()