On 25/08/2010 17:47, Raf Geens wrote:
 On 25/08/2010 17:15, Michael Bayer wrote:
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:

Thanks for the quick reply. I've looked at the SQL output of the last commit and it appears to match on the correct primary key. However, the Individual has a version_id_col defined in the mapper, and it's trying to match on the wrong value there, which seems to cause the update to fail. I'll try to reproduce it in a full script.

Raf

This one reproduces it for me:

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)
    stamp = Column(Integer, default = 0)
    __mapper_args__ = {'version_id_col' : stamp}
    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()

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