繁体   English   中英

了解 SQLAlchemy 中的 session.merge()

[英]Understanding session.merge() in SQLAlchemy

我试图了解如何在不同线程之间传递 SQLAlchemy 对象,以及是否有可能。 这是一个示例代码,我尝试在一个线程中读取一个对象,然后在另一个线程中使用它。 为什么我得到'Instance <User at 0x19fe1c8c088> is not bound to a Session; 属性刷新操作无法继续'错误? 这不是使用 Session.merge() 的正确方法吗? 错误发生在行 print('Got user', user.id)

from concurrent.futures import ThreadPoolExecutor
import queue

def read_user(name, queue):
    with Session() as session:
        with session.begin():
            print(f'Reading user with name={name} from DB')
            user = session.query(User).filter_by(name=name).first()
            print('User', user)
            queue.put(user)

def update_user(age, queue):
    user = queue.get()
    print('Got user', user.id)
    with Session() as session:
        with session.begin():
            local_user = session.merge(user)
            print(f'Thread-local user object: {local_user}')
            
queue = queue.Queue(1)
with ThreadPoolExecutor(max_workers=2) as executor:
    executor.submit(read_user, 'John', queue)
    future = executor.submit(update_user, 20, queue)
    print(future.result())

在 sessionmaker args 中设置 expire_on_commit=False 修复了问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM