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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.