Hi, using scoped_session(sessionmaker()) to create my sessions, if I
hammer a
request (using Pylons) by repeatedly clicking on a link that uses the
ORM
somewhat extensively for the relevant request, it seems that another
thread is
getting involved with SQLAlchemy internals and pulling the rug out
from under
its feet. Here's the change I made to stop the exception from
happening, but
we're just wondering if I've done something else wrong or if this is
an actual
bug in SQLAlchemy:
Index: state.py
===================================================================
--- state.py (revision 5974)
+++ state.py (working copy)
@@ -170,9 +170,14 @@
attr.impl.key in self.expired_attributes and
attr.impl.key in unmodified
])
- for k in self.expired_attributes:
- self.callables.pop(k, None)
- del self.expired_attributes
+ try:
+ for k in self.expired_attributes:
+ self.callables.pop(k, None)
+ del self.expired_attributes
+ except AttributeError:
+ # XXX: self.expired_attributes can be del'ed by another
thread
+ # which raises an AttributeError here
+ pass
return ATTR_WAS_SET
@property
Here's the original traceback before the change:
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/
prospectspace/controllers/company.py', line 206 in index
return self.render_response('company.mako', t_pars)
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/
prospectspace/lib/base.py', line 372 in render_response
page = tmpl.render(**kargs)
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/Mako-0.1.8-py2.5.egg/mako/template.py', line
114 in render
return runtime._render(self, self.callable_, args, data)
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/Mako-0.1.8-py2.5.egg/mako/runtime.py', line
287 in _render
_render_context(template, callable_, context, *args,
**_kwargs_for_callable(callable_, data))
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/Mako-0.1.8-py2.5.egg/mako/runtime.py', line
304 in _render_context
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/Mako-0.1.8-py2.5.egg/mako/runtime.py', line
337 in _exec_template
callable_(context, *args, **kwargs)
File 'prospectmaster_mako', line 61 in render_body
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/SQLAlchemy-0.5.4p1-py2.5.egg/sqlalchemy/orm/
attributes.py', line 158 in __get__
return self.impl.get(instance_state(instance), instance_dict
(instance))
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/SQLAlchemy-0.5.4p1-py2.5.egg/sqlalchemy/orm/
attributes.py', line 374 in get
value = callable_()
File '/home/bob/src/prospectspace/branches/sqlalchemy-eon-merge/lib/
python2.5/site-packages/SQLAlchemy-0.5.4p1-py2.5.egg/sqlalchemy/orm/
state.py', line 175 in __call__
del self.expired_attributes
AttributeError: expired_attributes
And here's how I'm dealing with creating the sessions:
threadlocal = threading.local()
Session = scoped_session(sessionmaker(autocommit=True))
Session.metadata = None
def setup_db():
if hasattr(threadlocal, 'engine'):
return
uri = config['main.engine.dburi']
threadlocal.engine = create_engine(uri)
Session.configure(bind=threadlocal.engine)
if Session.metadata is None:
Session.metadata = MetaData(threadlocal.engine)
model.initialise(Session.metadata)
And then each request does this:
setup_db()
environ['dbsession'] = Session()
The reason for including this bit is because I'm not convinced I'm
doing it
correctly, so I want to make sure that, if I am doing it wrong, this
isn't
what's causing the problem in SQLAlchemy, i.e. it may not be a bug at
all.
Please let me know if you need any more code/info - thanks a lot for
any help.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---