首页 > 解决方案 > Python 仅在函数或方法内运行基于连接的应用程序

问题描述

我有一个使用 connexion 和 swagger 的应用程序,并且已经相当大了。就像在这个框架的示例中一样,与数据库的连接是在任何函数或类之外创建的。我发现这种方法是一种非常糟糕的设计,我真的觉得应该有一个地方(例如 main()),在那里创建所有必要的对象并在它们上调用一些 .run() 方法。

我想要的最低要求是至少拥有在 swagger.yaml 中注册为端点处理程序的函数,以接受我提供的数据库连接,而不是必须在应用程序启动时创建并可供所有函数使用的函数。

有没有办法实现这样的事情,或者我是否必须在一个文件中创建数据库连接并且所有其他文件都导入它并使用它?

标签: python-3.xconnexion

解决方案


在您引用的示例中,我认为我们 orm.init_db('sqlite:///:memory:')在 If Main 之外调用是令人遗憾的。在示例中它是无害的,但请考虑相关情况,例如

  1. sqlite:////tmp/pets.db 或
  2. 与数据库服务器的 TCP 连接

由于副作用,无法安全地import编辑该文件——它会留下一个 .db 文件,或者如果我们缺乏凭据或网络连接,它可能会因连接错误而死。这会影响例如$ python -m doctest。所以我更喜欢推迟创建连接,直到我们真正需要它,单例 getter 可以轻松做到这一点。(或者让一个类__init__()创建连接。)


对于您的应用程序,与其传递全局或参数连接,不如考虑传递一个可以根据需要获取连接的函数对象。它为您提供了一定程度的间接性,并允许进行条件处理。


推荐阅读