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

Reply via email to