Hello,
Thanks for the fix. I downloaded latest changes r5060. The test I had done
earlier is now going thru. But I am getting exceptions at other places :
Traceback (most recent call last):
File "SchemaTest.py", line 206, in ?
USERIDLIST.append(user.UserID)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\attributes.py", line 135, in __get__
return self.impl.get(instance_state(instance))
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\attributes.py", line 325, in get
value = callable_()
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\attributes.py", line 892, in __call__
class_manager.deferred_scalar_loader(self, [
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\mapper.py", line 1698, in _load_scalar_attributes
result = session.query(mapper)._get(identity_key, refresh_state=state,
only_
load_props=attribute_names)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\query.py", line 1181, in _get
return q.all()[0]
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\query.py", line 979, in all
return list(self)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\query.py", line 1044, in __iter__
return self._execute_and_instances(context)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\query.py", line 1047, in _execute_and_instances
result = self.session.execute(querycontext.statement,
params=self._params, m
apper=self._mapper_zero_or_none(), _state=self._refresh_state)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\orm\session.py", line 749, in execute
return self.__connection(engine, close_with_result=True).execute(
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\base.py", line 848, in execute
return Connection.executors[c](self, object, multiparams, params)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\base.py", line 899, in execute_clauseelement
return self._execute_compiled(elem.compile(dialect=self.dialect,
column_keys
=keys, inline=len(params) > 1), distilled_params=params)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\base.py", line 908, in _execute_compiled
context = self.__create_execution_context(compiled=compiled,
parameters=dist
illed_params)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\base.py", line 952, in __create_execution_context
return self.engine.dialect.create_execution_context(connection=self,
**kwarg
s)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\databases\sqlite.py", line 266, in create_execution_context
return SQLiteExecutionContext(self, connection, **kwargs)
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\default.py", line 170, in __init__
self.cursor = self.create_cursor()
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\default.py", line 267, in create_cursor
return self._connection.connection.cursor()
File
"c:\python24\lib\site-packages\SQLAlchemy-0.5.0beta4dev_r5060-py2.4.egg\s
qlalchemy\engine\base.py", line 589, in connection
raise exc.InvalidRequestError("This Connection is closed")
sqlalchemy.exc.InvalidRequestError: This Connection is closed
The line USERIDLIST.append(user.UserID),is trying to append the newly added
(to the database) user object's primary key (UserID) into a List in one
thread , to be used by another thread which tries to modify the object. Its
throwing up exceptions there.
This error will go away if I set expire_on_commit = False.
Cheers,
Harish
On Fri, Aug 22, 2008 at 8:41 PM, Michael Bayer <[EMAIL PROTECTED]>wrote:
> The actual fix for this is in r5052. The ticket is not complete as tests
> have not yet been added but your test now passes.
>
>
> On Aug 22, 2008, at 5:51 AM, Harish K Vishwanath wrote:
>
> 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: [email protected]
>
>
> 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
>
>
>
>
>
> >
>
--
Regards,
Harish
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---