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.

#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.

Reply via email to