On Sat, Jan 13, 2018 at 3:31 PM, Ruben Di Battista <rubendibatti...@gmail.com> wrote: > > > On Friday, January 12, 2018 at 10:54:49 AM UTC+1, Simon King wrote: >> >> If I understand your code correctly, scheduler.propagate() creates a >> large number of Passage instances, and you only want a small subset of >> them to be added to the database. Is that correct? > > > Correct! > >> >> I would guess that the passages are getting added to the session >> because you are setting their 'satellite' property to point to a >> Satellite which is already in the database. This then causes the >> passages to be added to the session due to the default cascade rules >> on the relationship >> (http://docs.sqlalchemy.org/en/latest/orm/cascades.html). >> >> If that really is the case, you can change the cascade rules for that >> relationship, and then you'll probably need to explicitly add the >> passages you want to *keep* to the session instead. >> >> Hope that helps, >> >> Simon > > > Dear Simon, > thank you. That was the case. Modifying the cascade disabling the backref > cascade does not load in the DB the passages at propagation time. > > But now, when I manually add the subset of passages after the optimization, > I get a: > > InvalidRequestError: Can't attach instance <Satellite at 0x108c4dfd0>; > another instance with key [...] is already present in this section. > > So, I suppose that disabling the backref cascade now SQLAlchemy is not > capable anymore to recognize the already loaded Satellite objects... > > Should I maybe merge somewhere? >
It sounds like your propagate() function is creating new Satellite instances with the same primary key as instances that have been loaded from the database. Merging is one way to avoid that, and the UniqueObject pattern is another. It's difficult to say which is more appropriate for your usage without seeing more code. But if propagate() is only supposed to be calculating passages, I don't understand why new Satellites are being created at all - shouldn't all the Satellites already be loaded? Simon -- 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.