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 <l...@rational-it.com> 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 <si...@simonking.org.uk> 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 <l...@rational-it.com> 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 > > l...@rational-it.com > > +31 6 26 88 55 39 > > ==================================== > > > > On 2 sep. 2013, at 17:39, Simon King <si...@simonking.org.uk> wrote: > > > >> On Mon, Sep 2, 2013 at 4:01 PM, lars van gemerden <l...@rational-it.com> > >> 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 > >> sqlalchemy+unsubscr...@googlegroups.com. > >> To post to this group, send email to sqlalchemy@googlegroups.com. > >> 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 sqlalchemy+unsubscr...@googlegroups.com. > > To post to this group, send email to sqlalchemy@googlegroups.com. > > 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 > sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/groups/opt_out. > > > > -- > ==================================== > Lars van Gemerden > l...@rational-it.com > +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 sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/groups/opt_out.