0

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

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

这是我的设置:

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 线程并使用 APScheduler

def query_build():
    with db_session() as session:
        session.query(Build).filter(Build.number == -1).all()

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

sqlalchemy.exc.InvalidRequestError: This transaction is inactive

正如我在许多地方所读到的,scoped_session 是线程安全的,但根据我的经验,它根本不起作用。

4

1 回答 1

0

显然, 的位置connect()是导致这种行为的原因。删除connect呼叫解决了问题:

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))
于 2020-11-19T19:40:20.800 回答