首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sqlAlchemy 'scoped_session‘的并发查询引发异常'This transaction is inactive’

使用sqlAlchemy 'scoped_session‘的并发查询引发异常'This transaction is inactive’
EN

Stack Overflow用户
提问于 2020-11-20 02:40:04
回答 1查看 72关注 0票数 0

如果之前有人问过这个问题,我很抱歉,但我到处搜索,都找不到解决问题的方法。

我正在尝试实现一个非常简单的任务,即同时从多个线程向postgres DB发送查询。

这是我的设置:

代码语言:javascript
运行
复制
engine = create_engine(
    f'postgresql://postgres:{password}@{host}:5432/dbname',
    pool_pre_ping=True).connect().execution_options(
    schema_translate_map={None: "my_db"})
Session = scoped_session(sessionmaker(bind=engine))

@contextmanager
def db_session():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

这就是我试图从每个线程运行的代码(尝试使用原生python Thread和APScheduler

代码语言:javascript
运行
复制
def query_build():
    with db_session() as session:
        session.query(Build).filter(Build.number == -1).all()

如果我从2个或更多的线程运行上述方法,在发送commit()时,我会不断收到来自每个线程的以下异常:

代码语言:javascript
运行
复制
sqlalchemy.exc.InvalidRequestError: This transaction is inactive

正如我在许多地方读到的那样,scoped_session应该是线程安全的,但根据我的经验,它根本不能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 03:40:21

显然,connect()的位置是导致此行为的原因。删除connect调用解决了问题:

代码语言:javascript
运行
复制
engine = create_engine(
    f'postgresql://postgres:{password}@{host}:5432/dbname',
    pool_pre_ping=True).execution_options(
    schema_translate_map={None: "my_db"})
Session = scoped_session(sessionmaker(bind=engine))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64918007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档