Python 线程上的SQLAlchemy作用域_会话更新不会提交

Python 线程上的SQLAlchemy作用域_会话更新不会提交,python,multithreading,sqlalchemy,Python,Multithreading,Sqlalchemy,我完全不了解SQLAlchemy,但我在从线程作用域的_会话更新对象时遇到了一个问题。我计划运行几个线程,所有这些线程都将更新数据库中的不同行,每个行都有自己的作用域_会话。但我似乎无法让作用域会话提交并实际更新.db文件 以下是重新创建我的问题的最低代码: from sqlalchemy import * from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.ext.declarative import

我完全不了解SQLAlchemy,但我在从线程作用域的_会话更新对象时遇到了一个问题。我计划运行几个线程,所有这些线程都将更新数据库中的不同行,每个行都有自己的作用域_会话。但我似乎无法让作用域会话提交并实际更新.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()
此项(如预期)的输出为:

但是在运行这个之后,.db文件仍然只有一行带有“bill”。。。我不明白为什么它没有被更新为“ted”。。。我花了一些时间多次阅读SQLAlchemy文档,但正如我提到的,我是一个彻头彻尾的笨蛋,很多都是我的脑袋。
任何帮助都将不胜感激


-布兰登

订单
来自
session1
,但
session1
从未提交。您可能希望在
session2
中运行一个查询,获取所需的顺序,然后执行更新。或者查看用于分离和合并对象和会话的会话文档Yep,只是为了添加到@snakecharmerb的响应中,这里是:>…不仅会话对象本身,而且与该会话关联的所有对象都必须保持在单个并发线程的范围内。你看,就是这样!!谢谢你们两位的帮助<代码>订单来自
session1
,但
session1
从未提交。您可能希望在
session2
中运行一个查询,获取所需的顺序,然后执行更新。或者查看用于分离和合并对象和会话的会话文档Yep,只是为了添加到@snakecharmerb的响应中,这里是:>…不仅会话对象本身,而且与该会话关联的所有对象都必须保持在单个并发线程的范围内。你看,就是这样!!谢谢你们两位的帮助!!
bill
ted
[Finished in 0.3s]