Я создал класс Result, который принимает оператор sqlalchemy, сохраняет его, выполняет оператор и сохраняет результаты выполнения.
Если оператор выполняется непосредственно в __init__(), приведенный ниже сценарий дает ожидаемый результат:
1 Test JE 1
2 Test JE 2
Но если оператор выполняется в set_result(), сценарий ниже выводит «Нет результатов». При использовании pdb отображается _cleanup() вызывается после set_result():
--Call--
> /usr/lib/python3/dist-packages/sqlalchemy/orm/state.py(420)_cleanup()
Почему _cleanup() вызывается после set_result(), а не после __init__()?
сценарий
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy import Column, String, Integer, select
Base = declarative_base()
class JournalEntry(Base):
__tablename__ = 'JournalEntry'
pid = Column(Integer, primary_key=True)
desc = Column(String, nullable=False)
def __repr__(self):
return f"{self.pid} {self.desc}"
class db:
engine = create_engine('sqlite:///:memory:', echo=False)
Base.metadata.create_all(engine)
Session = sessionmaker(engine)
class Result:
"""Helper for printing query results."""
def __init__(self, stmt):
self.stmt = stmt
with db.Session() as session:
self.result = session.scalars(self.stmt).all()
#self.result = self.set_result()
def set_result(self):
with db.Session() as session:
self.result = session.scalars(self.stmt).all()
breakpoint()
# objects in self.result get cleaned
def __repr__(self):
try:
resultstr = ""
for obj in self.result:
resultstr += f"{obj}\n"
return resultstr
except TypeError:
return "No results."
if __name__ == '__main__':
je1 = JournalEntry(desc="Test JE 1")
je2 = JournalEntry(desc="Test JE 2")
with db.Session.begin() as session:
session.add_all([je1, je2])
gj = Result(select(JournalEntry))
print(gj)
Подробнее здесь: https://stackoverflow.com/questions/787 ... onstructor