SQLAlchemy - L'oggetto "Tabella" non ha l'attributo "_query_cls" quando si esegue una query su una tabella ottenuta con riflettere
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
In
Session.query(table)
non stai chiamando un metodo di Session
un'istanza, ma stai passando l' Table
oggetto come self
argomento, 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 Session
classe, 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()