如果之前有人问过这个问题,我很抱歉,但我到处搜索,都找不到解决问题的方法。
我正在尝试实现一个非常简单的任务,即同时从多个线程向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 Thread和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应该是线程安全的,但根据我的经验,它根本不能工作。
发布于 2020-11-20 03:40:21
显然,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))
https://stackoverflow.com/questions/64918007
复制相似问题