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