| Gambit 
    gambit at alpenjodel.de Fri Jun 8 16:25:18 EDT 2007 
 Hi,
I'm trying to write a fairly simple web app using mod_python and 
SQLAlchemy and I'm getting stability problems with the database which 
apparently are threading issues.
Basically what I do is to create a SQLAlchemy engine in a separate 
module that is imported once at the beggining of my app:
db = sa.create_engine('mysql://user:pass@localhost/mydb')
And then I use this db variable freely in my code. This leads to errors 
when multiple users are using the app.
The people at the SQLAlchemy mailing list didn't saw a problem with my 
approach and suggested this is a mod_python/mysql issue.
Browsing through the archives of this list I found some possible 
explanations in an earlier discussion:
> multiple threads in apache get multiple copies of mod_python, each with
> it's own copy of the imported database module in memory and each module
> maintaining a different database connection
> The process which apache chooses to to handle a request is random.
> Don't be fooled into thinking that module-level attributes are global
> across your application as they are not. In anything other than winnt-mpm
> (which is a single, threaded process), you will have multiple, independent
> copies of that variable. 
So... I conclude I have multiple, independent SQLAlchemy engines created 
and thus I cannot just use the db object I created freely in my app.
Does anyone knows how to solve this? Is someone here using mod_python 
and SQLAlchemy together successfully? Care to share some best practices?
Thanks in advance
Some sample code follows
In dbinit.py:
db = sa.create_engine('mysql://user:pass@localhost/mydb')
metadata = sa.BoundMetaData(db)
users_table = sa.Table('Users', metadata, autoload=True)
class User(object):
     pass
sa.orm.clear_mappers()
sa.mapper(User, users_table)
In myapp.py
import logging
import sqlalchemy as sa
from dbinit import *
def justatest(req):
      dbsession = sa.create_session(bind_to=db)
      query = dbsession.query(User)
      requested_uid = sanitize(req.form['uid'])
      try:
          user = query.get_by(Uid=requested_uid)
      except sa.exceptions.SQLError, details:
          logging.debug("got this error: %s" % details)
          dbsession.close()
          return "Yet another crash"
      else:
          dbsession.close()
          return show_message(req, "Looks good")
 |