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.

Reply via email to