Hello, I am SQLA 0.5beta4r5051. I am having issues with session having expire_on_commit as True. Below is an example :
*File : sqla05betatest.py* from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData from sqlalchemy.orm import mapper, sessionmaker engine = create_engine("sqlite:///:memory:",echo=True) class User(object): def __init__(self,name="anonymous"): self.id = 0 self.name = name def __repr__(self): return "<User ID : %s, Name : %s>" % (repr(self.id),self.name) metadata = MetaData() usertable = Table('users',metadata, Column('id',Integer,primary_key=True), Column('name',String(50)) ) metadata.create_all(engine) mapper(User,usertable) Session = sessionmaker(bind=engine,autocommit=False,autoflush=False) #expireoncommit is True session = Session() Now using Python 2.4 interpreter : >>> from sqla05betatest import * 2008-08-22 14:50:17,852 INFO sqlalchemy.engine.base.Engine.0x..70 PRAGMA table_i nfo("users") 2008-08-22 14:50:17,852 INFO sqlalchemy.engine.base.Engine.0x..70 {} 2008-08-22 14:50:17,852 INFO sqlalchemy.engine.base.Engine.0x..70 CREATE TABLE users ( id INTEGER NOT NULL, name VARCHAR(50), PRIMARY KEY (id) ) 2008-08-22 14:50:17,852 INFO sqlalchemy.engine.base.Engine.0x..70 {} 2008-08-22 14:50:17,852 INFO sqlalchemy.engine.base.Engine.0x..70 COMMIT >>> u = User("One") >>> session.add(u) >>> session.commit() 2008-08-22 14:50:32,150 INFO sqlalchemy.engine.base.Engine.0x..70 BEGIN 2008-08-22 14:50:32,150 INFO sqlalchemy.engine.base.Engine.0x..70 INSERT INTO us ers (id, name) VALUES (?, ?) 2008-08-22 14:50:32,150 INFO sqlalchemy.engine.base.Engine.0x..70 [0, 'One'] 2008-08-22 14:50:32,150 INFO sqlalchemy.engine.base.Engine.0x..70 COMMIT >>> u.id = 1 >>> session.add(u) >>> session.commit() 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 BEGIN 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 [1, 1] 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 ROLLBACK Traceback (most recent call last): File "<stdin>", line 1, in ? File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\session.py", line 663, in commit self.transaction.commit() File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\session.py", line 375, in commit self._prepare_impl() File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\session.py", line 359, in _prepare_impl self.session.flush() File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\session.py", line 1351, in flush self._flush(objects) File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\session.py", line 1419, in _flush flush_context.execute() File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\unitofwork.py", line 265, in execute UOWExecutor().execute(self, tasks) File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\unitofwork.py", line 757, in execute self.execute_save_steps(trans, task) File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\unitofwork.py", line 772, in execute_save_steps self.save_objects(trans, task) File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\unitofwork.py", line 763, in save_objects task.mapper._save_obj(task.polymorphic_tosave_objects, trans) File "c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5051-py2.4.egg\s qlalchemy\orm\mapper.py", line 1206, 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 When I set u.id = 1, session.add(u), session.commit() , It should've issued an UPDATE sql updating id from '0' to '1'. But instead : 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 14:50:51,477 INFO sqlalchemy.engine.base.Engine.0x..70 [1, 1] Why is this? Now, If I use Flush instead of commit (but the session is autoflush = False, and autocommit=False) >>> u.id = 1 >>> session.add(u) >>> session.flush() 2008-08-22 15:00:08,470 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 15:00:08,470 INFO sqlalchemy.engine.base.Engine.0x..70 [1, 0] >>> u.id = 2 >>> session.add(u) >>> session.flush() 2008-08-22 15:00:30,375 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 15:00:30,375 INFO sqlalchemy.engine.base.Engine.0x..70 [2, 1] >>> u.id = 3 >>> session.add(u) >>> session.flush() 2008-08-22 15:00:40,688 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 15:00:40,688 INFO sqlalchemy.engine.base.Engine.0x..70 [3, 2] It issues the proper SQL and there are no exceptions. Why is this happening? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---