Further to below , if I do : >>> u.id = 9 >>> session.commit() 2008-08-22 15:16:54,066 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 15:16:54,082 INFO sqlalchemy.engine.base.Engine.0x..70 [9, 8] 2008-08-22 15:16:54,082 INFO sqlalchemy.engine.base.Engine.0x..70 COMMIT >>> u 2008-08-22 15:16:55,332 INFO sqlalchemy.engine.base.Engine.0x..70 BEGIN 2008-08-22 15:16:55,332 INFO sqlalchemy.engine.base.Engine.0x..70 SELECT users.i d AS users_id, users.name AS users_name FROM users WHERE users.id = ? 2008-08-22 15:16:55,332 INFO sqlalchemy.engine.base.Engine.0x..70 [9] <User ID : 9, Name : One> >>> u.id = 11 >>> session.commit() 2008-08-22 15:17:03,630 INFO sqlalchemy.engine.base.Engine.0x..70 UPDATE users S ET id=? WHERE users.id = ? 2008-08-22 15:17:03,630 INFO sqlalchemy.engine.base.Engine.0x..70 [11, 9] 2008-08-22 15:17:03,630 INFO sqlalchemy.engine.base.Engine.0x..70 COMMIT
That is, before setting the id to a new value, if I just let the session do its query (since the object is expired after prev commit), there seems to be no problem in further commits. But as I mentioned in the below mail, using session.flush() without letting the session do its query seems to work. Does flush internally query and get the object before flushing it to DB which commit() doesn't seem to do? ---------- Forwarded message ---------- From: Harish K Vishwanath <[EMAIL PROTECTED]> Date: Fri, Aug 22, 2008 at 3:02 PM Subject: Autoexpire on commit is causing problems? To: sqlalchemy@googlegroups.com 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? -- Regards, Harish --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---