My version is 0.7.5 (thought i was on 8 already), i will look at updating! The error sounds similar, I'll get back on this after i do (after some research to find out if updating is a good idea right now)
Cheers, Lars On Tue, Sep 3, 2013 at 11:38 AM, Simon King <[email protected]> wrote: > I realised after I sent that script that I wasn't reproducing quite > the same situation. I should have loaded the person from the database > in sess2 as well, before trying to add the instance from sess1. In > other words, change the end of the test script to say: > > sess2 = Session() > dupe = sess2.query(Person).first() > sess2.add(person) > sess2.commit() > > So sess2 now contains an instance representing that database row. The > error message is now: > > AssertionError: A conflicting state is already present in the identity > map for key (<class '__main__.Person'>, (1,)) > > ...which is still not quite the same as your error message. What > version of SQLAlchemy are you using? (The above was from 0.8.2) > > Simon > > On Tue, Sep 3, 2013 at 10:15 AM, lars van gemerden <[email protected]> > wrote: > > I am getting that same error (not the original one). For the moment i've > > solved the problem in a different way, but it might pop up again. I'll > keep > > merge in mind (i've run into the" is already attached to session" > before). > > > > Thank you, Lars > > > > > > On Monday, September 2, 2013 9:18:11 PM UTC+2, Simon King wrote: > >> > >> Dunno, let's try it: > >> > >> import sqlalchemy as sa > >> import sqlalchemy.orm as saorm > >> from sqlalchemy.ext.declarative import declarative_base > >> > >> Base = declarative_base() > >> > >> class Person(Base): > >> __tablename__ = 'people' > >> id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) > >> name = sa.Column(sa.String(20)) > >> > >> if __name__ == '__main__': > >> engine = sa.create_engine('sqlite:///:memory:') > >> Base.metadata.create_all(engine) > >> Session = saorm.sessionmaker(bind=engine) > >> > >> # Create our first session and use it to add a Person to the > database > >> sess1 = Session() > >> sess1.add(Person(name='lars')) > >> sess1.commit() > >> sess1.close() > >> > >> # Retrieve our Person from the database again. > >> person = sess1.query(Person).first() > >> > >> # Now try to add that instance to a second session > >> sess2 = Session() > >> sess2.add(person) > >> sess2.commit() > >> > >> > >> Output: > >> > >> Traceback (most recent call last): > >> ... > >> sqlalchemy.exc.InvalidRequestError: Object '<Person at 0x10c9f5790>' is > >> already attached to session '1' (this is '2') > >> > >> Looks very similar to your error message. I'm using SA 0.8.0 - it looks > >> like the message is slightly different in your version. > >> > >> The correct thing to do in this case is to use "session.merge" to > create a > >> copy of the object, attached to the new session. If you change the last > few > >> lines of the script above to: > >> > >> sess2 = Session() > >> merged = sess2.merge(person) > >> sess2.add(merged) > >> > >> ...it works fine. > >> > >> Hope that helps, > >> > >> Simon > >> > >> On 2 Sep 2013, at 19:58, lars van Gemerden <[email protected]> > wrote: > >> > >> > Yes I know the question was a bit vague, but i couldn't think of a > >> > simple way to show some code. A test case would probably require some > major > >> > surgery; I'll consider it though. > >> > > >> > It is possible that the second instance is associated with a different > >> > session, i'd have to check. What actually happens if you add the same > >> > instance to a second session? > >> > > >> > CL > >> > > >> > > >> > On Mon, Sep 2, 2013 at 8:23 PM, Simon King <[email protected]> > >> > wrote: > >> > Without knowing your application it's very difficult to know... > >> > > >> > Is there any chance that the second object is already associated with > a > >> > different session? Perhaps from a different thread, or retrieved from > a > >> > cache or something similar? > >> > > >> > Producing a standalone test script would help in diagnosing the > problem. > >> > > >> > Simon > >> > > >> > > >> > On 2 Sep 2013, at 18:56, Lars van Gemerden <[email protected]> > >> > wrote: > >> > > >> > > Well, from the message yes, but i am not setting any primary keys > >> > > manually, so where could the second instance come from? > >> > > > >> > > CL > >> > > > >> > > ==================================== > >> > > Lars van Gemerden > >> > > [email protected] > >> > > +31 6 26 88 55 39 > >> > > ==================================== > >> > > > >> > > On 2 sep. 2013, at 17:39, Simon King <[email protected]> > wrote: > >> > > > >> > >> On Mon, Sep 2, 2013 at 4:01 PM, lars van gemerden > >> > >> <[email protected]> wrote: > >> > >>> Hi all, > >> > >>> > >> > >>> I have a one-to-one and many-to-one relationship (with an > >> > >>> association table > >> > >>> in the middle; Report.author-assoctable-Person.reports; why the > >> > >>> table in the > >> > >>> middle, you might ask, well it's a long story) and i am setting > the > >> > >>> author > >> > >>> on a specific Report twice to the same value. This gives the > >> > >>> following > >> > >>> error: > >> > >>> > >> > >>> InvalidRequestError: Can't attach instance <person at > >> > >>> 0x36a9350>; > >> > >>> another instance with key (<class 'models.data.classes.person'>, > >> > >>> (2,)) is > >> > >>> already present in this session. > >> > >>> > >> > >>> The first time i set the author, it works and if i change the > author > >> > >>> it > >> > >>> works as well. > >> > >>> > >> > >>> This seems i little strange to me, why not be able to set the > >> > >>> attribute to > >> > >>> the same value twice? > >> > >>> > >> > >>> Otherwise i have to check whether the new and old values are equal > >> > >>> (which > >> > >>> through the peculiarties of my code is somewhat wastefull) > >> > >>> > >> > >> > >> > >> I think the message is actually telling you that you have 2 > different > >> > >> instances of your "person" class with the same primary key. > >> > >> SQLAlchemy > >> > >> uses an identity map to ensure that a particular row in the > database > >> > >> is only identified by a single instance within a particular > session. > >> > >> If you violate that assumption (eg. by loading one instance of > >> > >> "person" from the database, then creating another instance and > >> > >> setting > >> > >> its primary key), you will get errors like this. > >> > >> > >> > >> Does that sound plausible? > >> > >> > >> > >> Simon > >> > >> > >> > >> -- > >> > >> You received this message because you are subscribed to a topic in > >> > >> the Google Groups "sqlalchemy" group. > >> > >> To unsubscribe from this topic, visit > >> > >> > https://groups.google.com/d/topic/sqlalchemy/bkm3-nB6d1o/unsubscribe. > >> > >> To unsubscribe from this group and all its topics, send an email to > >> > >> [email protected]. > >> > >> To post to this group, send email to [email protected]. > >> > >> Visit this group at http://groups.google.com/group/sqlalchemy. > >> > >> For more options, visit https://groups.google.com/groups/opt_out. > >> > > > >> > > -- > >> > > 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 [email protected]. > >> > > To post to this group, send email to [email protected]. > >> > > Visit this group at http://groups.google.com/group/sqlalchemy. > >> > > For more options, visit https://groups.google.com/groups/opt_out. > >> > > >> > -- > >> > You received this message because you are subscribed to a topic in the > >> > Google Groups "sqlalchemy" group. > >> > To unsubscribe from this topic, visit > >> > https://groups.google.com/d/topic/sqlalchemy/bkm3-nB6d1o/unsubscribe. > >> > To unsubscribe from this group and all its topics, send an email to > >> > [email protected]. > >> > To post to this group, send email to [email protected]. > >> > Visit this group at http://groups.google.com/group/sqlalchemy. > >> > For more options, visit https://groups.google.com/groups/opt_out. > >> > > >> > > >> > > >> > -- > >> > ==================================== > >> > Lars van Gemerden > >> > [email protected] > >> > +31 6 26 88 55 39 > >> > ==================================== > >> > > >> > -- > >> > 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 [email protected]. > >> > To post to this group, send email to [email protected]. > >> > Visit this group at http://groups.google.com/group/sqlalchemy. > >> > For more options, visit https://groups.google.com/groups/opt_out. > >> > > -- > > 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 [email protected]. > > To post to this group, send email to [email protected]. > > Visit this group at http://groups.google.com/group/sqlalchemy. > > For more options, visit https://groups.google.com/groups/opt_out. > > -- > You received this message because you are subscribed to a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/bkm3-nB6d1o/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/groups/opt_out. > -- ==================================== Lars van Gemerden [email protected] +31 6 26 88 55 39 ==================================== -- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.
