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

Reply via email to