抱歉,如果以前有人问过这个问题,但是我到处搜索,找不到解决问题的方法。
我正在尝试实现一个非常简单的任务,即同时从多个线程向 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 是线程安全的,但根据我的经验,它根本不起作用。