SQLAlchemy: el objeto 'Table' no tiene atributo '_query_cls' al consultar una tabla obtenida con reflect

Aug 21 2020

Estoy tratando de consultar una tabla con SQL Alchemy ORM a la que me conecté reflect(es una base de datos existente). Intenté usar el método descrito aquí: Cómo consultar una tabla, en sqlalchemy para consultar los datos, pero me salió un error.

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()

Obtuve el siguiente error:

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'

Yo uso la versión SQLAlchemy==1.3.19. Utilizo una base de datos PostgreSQL.

¿Es posible consultar los datos con el ORM al obtener la tabla así?

Respuestas

2 IljaEverilä Aug 21 2020 at 16:52

En

Session.query(table)

no está llamando a un método de una Sessioninstancia, sino pasando el Tableobjeto como selfargumento, porque Sessiones la clase, no una instancia. La forma habitual de hacer una sesión preconfigurada es utilizar sessionmakerpara crear una versión personalizada de la Sessionclase y luego crear una instancia de ella:

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()