I've found a strange behaviour when using multiple sessions: A
committed change to an object in one session does not get reflected in
the other session, even after a session.expire_all() (or expire() or
refresh() on the object. In fact, even an explicit query does not
retrieve the changed data. I'm using MySQL. Further investigation
showed that it happens only with InnoDB. Using MyISAM produces the
expected results. Looks like a caching issue with InnoDB.

Here is some test code:
--------------------------------------------
from sqlalchemy import create_engine, Table, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base=declarative_base()

class A(Base):
    __tablename__="a"
    __table_args__ = {'mysql_engine':'InnoDB'}

    id = Column(Integer, primary_key=True)
    data = Column(Integer)

engine = create_engine('mysql://localhost/test')
Base.metadata.bind = engine
Base.metadata.drop_all()
Base.metadata.create_all()

Session = sessionmaker(bind=engine)
session1 = Session()
session2 = Session()

a1 = A()
a1.id = 1
a1.data = 123

session1.add(a1)
session1.commit()

print a1.data   # trigger query of a1.data

a2 = session2.query(A).one()

print a1,a2     # to see that a1 and a2 are different objects
print a2.data

a2.data = 999
session2.commit()

print "a1.data: ", a1.data
print "session1.query(A.data): ", session1.query(A.data).one()[0]
print "session2.query(A.data): ", session2.query(A.data).one()[0]

print "session1.expire_all()"
session1.expire_all()

print "a1.data: ", a1.data
print "session1.query(A.data): ", session1.query(A.data).one()[0]
print "session2.query(A.data): ", session2.query(A.data).one()[0]
------------------------------------

The output is:
123
a1.data:  123
session1.query(A.data):  123
session2.query(A.data):  999
session1.expire_all()
a1.data:  123
session1.query(A.data):  123
session2.query(A.data):  999


When commenting out the __table_args__ line in order to use MyISAM,
the output is what one would expect:
123
a1.data:  123
session1.query(A.data):  999
session2.query(A.data):  999
session1.expire_all()
a1.data:  999
session1.query(A.data):  999
session2.query(A.data):  999


Any idea?

Thanks,
Erich

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