@update: calling the flush doen't seem to make any difference. At some point, the object looses track of it's grandparents
On Tuesday, August 22, 2017 at 3:57:23 PM UTC+2, cecemel wrote: > > Hi, > > so, I'm currently facing this issue, where I would like to do some calls > to an external service, when my object has been deleted within a flush. > For this operation to occur, I need the id from my model object, but also > the id from the parent of the parent object model. There are cases, where I > am unable to access them (I guess, depending of the order of the execution) > and I am unsure on what to do next. > > So if you're willing to give me some advice, would be awesome. > > Here is a dummy model: > > from sqlalchemy import event > > from sqlalchemy import * > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy.orm import sessionmaker, backref, relationship > > Base = declarative_base() > > > ######################################################################################### > # MODEL > ######################################################################################### > class House(Base): > __tablename__ = 'house' > id = Column(Integer, primary_key=True) > rooms = relationship("Room", > backref=backref("house", lazy="joined"), > cascade='all, delete-orphan') > > > class Room(Base): > __tablename__ = 'room' > id = Column(Integer, primary_key=True) > house_id = Column(Integer, ForeignKey('house.id')) > beds = relationship("Bed", > backref=backref("room", lazy="joined"), > cascade='all, delete-orphan') > > > class Bed(Base): > __tablename__ = 'bed' > id = Column(Integer, primary_key=True) > room_id = Column(Integer, ForeignKey('room.id')) > > > ######################################################################################### > # CONFIG > ######################################################################################### > def setup(): > engine = create_engine("sqlite:///foo.db", echo=True) > > Base.metadata.bind = engine > Base.metadata.create_all(engine) > > SessionFactory = sessionmaker( > bind=engine > ) > > event.listen(SessionFactory, 'deleted_to_detached', > listener_bed_has_been_removed) > > return SessionFactory > > > def listener_bed_has_been_removed(session, instance): > if type(instance) is not Bed: > return > > bed_id = instance.id > house_id = instance.room.house.id # this is NOT ALWAYS there. Depending > on the order of the execution I guess > > print("execute the service call to external service here bed_id {}, > house_id {}".format(bed_id, house_id)) > > > > > So my question(s): > > - Is there a clean way to always acces this parent's parent attribute? > - If not, would be starting a new session and query it from the > event handler be an option? (is it not dangerous, because it seems to > work) > - Additional quirk, I am working within a transaction manager > (pyramid_tm) and ZopeTransactionExtension() > > Thanks! > > > More information about the system: > > SQLAlchemy 1.1.13 > > Python 3.5 > > Postgres 9.6 > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.