通过SQLAlchemy创建了一个关系数据库。在开始引入线程之前,它一直运行良好。我做了一些阅读,发现每个线程必须有一个特定的会话。处理此问题的方法是按照https://docs.sqlalchemy.org/en/13/orm/contextual.html中的描述创建local_sessions。
我处理此问题的方法是在需要数据库连接的每个类方法中启动和关闭local_session。我已经建立了一个类:DBconnection为:
class DBconnection():
def __init__(self):
self.session_factory = sessionmaker(bind=some_engine)
self.Session = scoped_session(session_factory)
与此同时,我还有其他类,例如A类,它们从DBconnection类请求数据。
db_connection = DBconnection()
class A():
def get_stuff_done(self):
local_session = db_connection.Session()
object = local_session.query(MyClass).all()
# DOING STUFF to object[0]
local_session.add(object[0])
local_session.commit()
local_session.close()
return object[0]
我的理解是,如果我调用Session(),它将返回一个线程唯一的会话,如果我在离开该函数之前关闭了该会话,那么我会很清楚。但是我仍然遇到一个问题 “对象是在另一个线程中创建的”。我在会议上误解了吗?我以为我是通过使用scoped_session建立线程安全连接的,但此错误不断弹出:
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id xxxx and this is thread id yyyy.