SQLAlchemy: el objeto 'Table' no tiene atributo '_query_cls' al consultar una tabla obtenida con reflect
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
En
Session.query(table)
no está llamando a un método de una Session
instancia, sino pasando el Table
objeto como self
argumento, porque Session
es la clase, no una instancia. La forma habitual de hacer una sesión preconfigurada es utilizar sessionmakerpara crear una versión personalizada de la Session
clase 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()