a little programming puzzle.    The scoped_session() is a thread local registry 
which links a Session to the current thread.  When you say self.session = 
Session(), you're invoking the registry, generating a Session local to the 
current thread, then assigning it to a local variable.    In fact all four 
TestWriteToDB objects get a hold of the same Session object.  Then they enter 
run() within a new thread and all begin using the same session.

So you'd need to either use the proxy pattern provided by the scoped_session, 
that is just call Session.add_all(), or if you want to assign the local Session 
object do it in the thread.


On Oct 31, 2011, at 4:24 PM, Paul wrote:

> from sqlalchemy import create_engine, MetaData
> from sqlalchemy.orm import scoped_session,sessionmaker
> from sqlalchemy.ext.declarative import declarative_base
> 
> db_engine= create_engine("sqlite:///database.db"),echo=True)
> Base= declarative_base(db_engine)
> 
> class Failures(Base):
>  __tablename__= "failures"
>  __table_args__= {"autoload":True}
> 
>  def __repr__(self):
>    return "<Failures('%s','%s','%s')>" %(self.Id,self.action,self.reason)
> 
> metadata= Base.metadata
> Session= scoped_session(sessionmaker(bind=db_engine))
> 
> class TestWriteToDB(threading.Thread):
> 
>  def __init__(self,start):
>    threading.Thread.__init__(self)
>    self.session= Session()
>    self.insert_list=[]
>    for i in range(start,start+10):
>      f=Failures(resourceId=i,action=i,reason=i)
>      self.insert_list.append(f)
> 
>  def run(self):
>    self.session.add_all(self.insert_list)
>    self.session.commit()
> 
> 
> if __name__ == "__main__":
>  for i in range(1,40,10):
>    t=TestWriteToDB(i)
>    t.start()

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to