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.