Ah! I found it. In the classical mapping in the example, I forgot to set inherits=True.
Upgrading to 1.4.0b1 solved the other issues for me. On Friday, December 4, 2020 at 11:27:57 AM UTC-5 Vinit Shah wrote: > > Thanks both Mike and Simon for the input! Apologies for the late reply, > I've been trying to work this change into the non-example code, but ran > into some issues. Disabling the Cascading Backrefs resolved the error in > the sample, but I've stumbled onto a couple of different problems. > > Something to note: I'm using the classical mapping approach and calling > the mapper method direction. > > The issue in my own code base is that I'm seeing the following: > tokyo.destinationGates = [Gate(id=null, name='westGate'), Gate(id=west > gate's id, name='westGate')] > > The null id row is inserted after westGate's instantiation and the other > is inserted after the merge+commit. > > I've attempted to reproduce the issue in a gist, but have run into > something slightly different. > > In this new example, I'm getting an Instance <Location at 0x110dd0a50> has > a NULL identity key. I think this should be 1:1 with the original example, > but it looks like I may have missed something. I can post these questions > separately, but I figured since it is related to the original issue I'd > post here. > > The gist can be found below: > https://gist.github.com/funseiki/3ddb35f849ed3c9bfb38eae404e7b8b4 > > On Monday, November 23, 2020 at 10:01:53 AM UTC-5 Simon King wrote: > >> I think your situation is described here: >> >> >> https://docs.sqlalchemy.org/en/14/orm/session_state_management.html#merge-tips >> >> >> I'm not certain, but my guess is that when you create westGate, you >> cause a *copy* of typeDict['gate'] to be merged into the current >> session (because the merge cascades across the objectType >> relationship). This instance is marked as pending. Then when you try >> to create eastGate, the same thing happens again, but now there is >> *already* a pending copy of typeDict['gate'] in the session, so you >> get an error. >> >> The easiest solution would be to create a session-specific copy of >> typeDict, either by re-querying from the database, or by using >> session.merge with load=False. >> >> Hope that helps, >> >> Simon >> >> On Thu, Nov 19, 2020 at 11:16 PM Vinit Shah <elysium...@gmail.com> >> wrote: >> > >> > I posted this on StackOverflow a few days ago, but I haven't been able >> to figure this one out yet. The original post can be found here: >> StackOverflow: object "is already present in this session". >> > >> > I'm seeing the below error: >> > sqlalchemy.exc.InvalidRequestError: Can't attach instance <ObjectType >> at 0x10592fe50>; another instance with key ( <class '__main__.ObjectType'>, >> (1,), None) is already present in this session. >> > >> > I'm seeing this issue when I try to instantiate a new object that has a >> foreign key relationship with an existing object that was created in >> another session. >> > >> > This happens in a few different cases in my actual code, but in the >> provided sample it occurs with the following steps: >> > 1. Add a new object into a new session >> > 2. Close session and remove() from scoped_session >> > 3. Reference the object in two newly constructed ones via their >> relationship >> > 4. Error appears on the second object >> > >> > # typeDict just contains a pre-fetched ObjectTypes >> > tokyo = Location(name="tokyo", objectType=typeDict['location']) >> > tokyo = write(tokyo) >> > >> > # If I clear out the current session here, the error will occur >> > scopedSessionFactory().close() >> > scopedSessionFactory.remove() >> > >> > westGate = Gate(name="westGate", destination=tokyo, >> objectType=typeDict['gate']) >> > westGate = write(westGate) >> > >> > luggage = LocationInput(name="luggage", >> objectType=typeDict['locationinput']) >> > luggage = write(luggage) >> > >> > # This is the line where the error occurs >> > eastGate = Gate(name="eastGate", origin=tokyo, >> destinationInput=luggage, objectType=typeDict['gate']) >> > eastGate = write(eastGate) >> > >> > I'm not sure what exactly causes this or way. For this example, I could >> just reuse the same session, but I'd like to be able to take an object from >> one closed session and add as a relationship field to another. >> > >> > Full code sample available here: >> > https://gist.github.com/funseiki/a73424bebfb0d809e6d934f699a725bf >> > >> > -- >> > 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+...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/4d01df93-16ed-45a4-82f3-de04a8e57bcbn%40googlegroups.com. >> >> >> > -- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/00cbb858-1511-4af6-b6c5-ed56ccfcb0e5n%40googlegroups.com.