【发布时间】:2015-10-11 02:46:48
【问题描述】:
我在使用 sqlalchemy 和线程时遇到问题。
import queue
import threading
import sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.scoping import scoped_session
engine = create_engine('sqlite:///:memory:', echo=False)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
sessionfactory = sessionmaker(bind=engine)
# called by each thread
def write_name(q, name, sessionfactory):
session = scoped_session(sessionfactory)
ed_user = User(name=name, fullname='Power', password='edspassword')
session.add(ed_user)
session.commit()
q.put(name)
names = ["Max", "Austin"]
q = queue.Queue()
for u in names:
t = threading.Thread(target=write_name, args = (q, u, sessionfactory))
t.daemon = True
t.start()
s = q.get()
这会导致:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: users [SQL: 'INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)'] [parameters: ('Max', 'Power', 'edspassword')]
但在主线程中添加和读取数据效果很好。此外,我假设我需要在多进程上使用线程,因为 scoped_session 使用线程本地存储。
【问题讨论】:
标签: python multithreading sqlalchemy python-3.4