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

时间:2017-02-06 18:37:28

标签: python multithreading postgresql sqlalchemy

TL; DR:

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

详细信息:

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

我还使用 SQLAlchemy PostgreSQL 数据库进行通信(使用pg8000)。

因为我想将所有数据库内容与其他所有内容分开,所有 SQLAlchemy代码位于我称为db_manager.py的Python模块中。在这里,您将找到声明性基础,create_engine()调用,但也有大量方法来获取东西或在数据库中存储东西。这里的每种方法都以:

结束
session.commit() 

(除非我只查询数据库)。

然后,每个线程都会调用db_manager模块与数据库进行交互,例如:

db_manager.getSomethingFromDB(...)

我创建了一个小图来说明架构。

问题:

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

一些想法:

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

Illustration of the architecture

0 个答案:

没有答案