首页 > 解决方案 > 线程上的 SQLAlchemy scoped_session 更新不会提交

问题描述

我在这里完全是 SQLAlchemy 的菜鸟,但是我在从线程 scoped_session 更新对象时遇到问题。我计划运行几个线程,所有这些线程都将更新数据库中的不同行,每个都有自己的 scoped_session。但我似乎无法让作用域会话提交并实际更新 .db 文件。

以下是重现我的问题的最小代码:

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
from threading import Thread

session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
session1 = Session()
Base = declarative_base()

class Order(Base):
    __tablename__ = "orders"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String)
    def __init__(self, iterable=(), **kwargs):
        self.__dict__.update(iterable, **kwargs)

Base.metadata.create_all(engine)
session1.add(Order({'name':'bill'}))
session1.commit()

orders = session1.query(Order).all()
print(orders[0].name)

def funct():
    session2 = Session()
    orders[0].name = "ted"
    session2.commit()
    Session.remove()
    print(orders[0].name)

t1 = Thread(target=funct)
t1.start()

此(如预期)的输出是:

bill
ted
[Finished in 0.3s]

但是在运行这个之后,.db 文件仍然只有一行带有“bill”......我不明白为什么它没有被更新为“ted”......我花了一些时间阅读 SQLAlchemy 文档多次,但就像我提到的,我是一个完全的菜鸟,而且很多都在我的脑海中。
任何帮助将不胜感激。

-布兰登

标签: pythonmultithreadingsqlalchemy

解决方案


推荐阅读