Python 多线程和SQLAlchemy:如何防止数据库访问错误?

Python 多线程和SQLAlchemy:如何防止数据库访问错误?,python,multithreading,postgresql,sqlalchemy,Python,Multithreading,Postgresql,Sqlalchemy,TL;医生: 使用SQLAlchemy从Python中的多个线程调用PostgreSQL数据库时,如何防止数据库访问问题? 详细信息: 我正在开发一个使用多线程(concurrent.ThreadPool)的Python软件,但我绝对不是任何方面的专家 我还使用SQLAlchemy与PostgreSQL数据库通信(使用pg8000) 因为我希望将所有数据库内容与其他内容分开,allSQLAlchemy代码位于我称为db_manager.py的Python模块中。在这里,您将找到声明性的基础,即c

TL;医生:

使用SQLAlchemy从Python中的多个线程调用PostgreSQL数据库时,如何防止数据库访问问题?

详细信息:

我正在开发一个使用多线程(concurrent.ThreadPool)的Python软件,但我绝对不是任何方面的专家

我还使用SQLAlchemy与PostgreSQL数据库通信(使用pg8000)

因为我希望将所有数据库内容与其他内容分开,allSQLAlchemy代码位于我称为db_manager.py的Python模块中。在这里,您将找到声明性的基础,即create_engine()调用,但也会加载一些方法来获取数据或在数据库中存储数据。这里的每种方法都以以下内容结尾:

session.commit() 
(除非我只是查询数据库)

然后,每个线程将调用db_管理器模块与数据库交互,例如:

db_manager.getSomethingFromDB(...)
我画了一幅小图来说明建筑

问题:

现在我遇到的问题是,这些数据库调用有时似乎会发生冲突。 处理多线程、SQLAlchemy和PostgreSQL的最佳方法是什么

一些想法:

  • 目前,my db_manager以特定用户身份访问PostgreSQL(pg8000似乎需要此功能)。这是个问题吗?每个线程都应该是自己的用户吗?或者这不会引起问题吗?如果每个线程都需要成为自己的数据库用户,那么我可能无法再将所有数据库内容放在一个模块中
  • 我未能为每个提交定义回滚。我刚刚注意到这会导致问题,任何错误都会阻止进一步的数据库访问

所谓冲突,是指并发更新错误还是其他什么?你能发布具体的错误消息吗?@univerio:对不起。我应该把它写在我的帖子里。我当前遇到一条错误消息,该消息阻止我遇到以前的错误。当前错误消息为:
SAWarning:刷新进程的执行阶段当前不支持使用“Session.add()”操作。结果可能不一致。考虑使用替代事件侦听器或连接级别操作。方法)
这很可能是因为您试图跨不同线程使用同一会话。尝试改用。请参阅。出于特定目的,这意味着您至少应该为每个线程(即每个方法)创建一个会话。使用
scoped_session
将使它更容易。那么,
add
session
的一个属性;它恰好也是一个函数。不知道你为什么会遇到这种情况;您是如何构建
会话的