On Aug 25, 2010, at 10:50 AM, Raf Geens wrote: > Hi, > > I have a sqlite database A and a MySQL database B which share the same > schema, where I want to synchronize the contents of certain tables in > A with those in B at certain times. Except for the synchronizing step > the contents on A's side don't change, while those on B's side might. > > I'm trying to do this using Session.merge, which works if the row > doesn't exist yet in A, or does but hasn't changed in B. If it has > changed in B, I get a ConcurrentModificationError when the merge is > flushed.
can't reproduce in 0.5.6 nor in 0.6.3, so a full test script that reproduces will be needed. Alternatively, you might want to look at your SQL output and see what primary key is attempting to be updated: from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class A(Base): __tablename__ = 'a' id = Column(Integer, primary_key=True) firstname = Column(String) e1 = create_engine('sqlite://', echo=True) e2 = create_engine('sqlite://', echo=True) Base.metadata.create_all(e1) Base.metadata.create_all(e2) session_B = sessionmaker(e1)() session_A = sessionmaker(e2)() individual = A(firstname='foo') session_B.add(individual) session_B.commit() #Suppose this individual doesn't yet exist in A individual = session_B.query(A).one() session_A.merge(individual) #This will work and add the individual session_A.commit() individual.firstname = 'test' session_B.commit() individual = session_B.query(A).one() session_A.merge(individual) #This will throw the ConcurrentModificationError session_A.commit() > > #Suppose this individual doesn't yet exist in A > individual = session_B.query(Individual).filter(...).one() > session_A.merge(individual) > #This will work and add the individual > session_A.commit() > > individual.firstname = 'test' > session_B.commit() > > individual = session_B.query(Individual).filter(...).one() > session_A.merge(individual) > #This will throw the ConcurrentModificationError > session_A.commit() > > The error is: > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > session.py", line 673, in commit > self.transaction.commit() > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > session.py", line 378, in commit > self._prepare_impl() > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > session.py", line 362, in _prepare_impl > self.session.flush() > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > session.py", line 1356, in flush > self._flush(objects) > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > session.py", line 1434, in _flush > flush_context.execute() > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > unitofwork.py", line 261, in execute > UOWExecutor().execute(self, tasks) > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > unitofwork.py", line 753, in execute > self.execute_save_steps(trans, task) > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > unitofwork.py", line 768, in execute_save_steps > self.save_objects(trans, task) > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > unitofwork.py", line 759, in save_objects > task.mapper._save_obj(task.polymorphic_tosave_objects, trans) > File "C:\Python25\lib\site-packages\sqlalchemy-0.5.6-py2.5.egg > \sqlalchemy\orm\ > mapper.py", line 1401, in _save_obj > raise exc.ConcurrentModificationError("Updated rowcount %d does > not match nu > mber of objects updated %d" % (rows, len(update))) > sqlalchemy.orm.exc.ConcurrentModificationError: Updated rowcount 0 > does not matc > h number of objects updated 1 > > Am I trying to use Session.merge the wrong way? > > Kind regards, > Raf Geens > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.