我的问题是关于在生产环境或其他性能受关注的环境中使用Flask时处理数据库连接的推荐方法.在Flask中,g对象可用于存储内容,并且可以将打开的数据库连接放在那里,以允许应用程序在同一请求期间的后续数据库查询中重用它们.但是,g对象不会跨请求持久化,因此似乎每个新请求都需要一个新的数据库连接(以及由此带来的性能影响).

我在这件事上发现的最相关的问题是这个:How to preserve database connection in a python web server个,但答案只提出了连接池的抽象概念(没有将其与如何在Flask中使用以及如何跨请求生存联系在一起),或者提出了一个只与一种特定类型的数据库或特定堆栈相关的解决方案.

因此,我的问题是,当在连接到any种数据库的Flask上构建产品化应用程序时,应该采取什么样的一般方法.似乎涉及连接池的事情朝着正确的方向发展,尤其是因为这对传统的Python应用程序来说是可行的.但我想知道使用Flask时推荐的方法是什么,因为前面提到的跨连接持久性问题,以及生产中的Flask应用程序是从WSGI服务器运行的,这可能会增加更多的复杂性.

编辑:基于对炼金术的 comments .假设flask sqlalchemy解决了这个问题,它是否也适用于Neo4J,或者flask应用程序使用的任何任意数据库?许多现有的数据库连接器已经在本地支持池,那么为什么要引入一个额外的依赖项,其主要目的是提供ORM功能,而不是连接管理呢?另外,sqlalchemy如何绕过跨请求持久性的基本问题?

推荐答案

事实证明,有一个简单的方法可以实现我想要的东西.但正如 comments 者建议的那样,如果完全可以走Flask 炼金术路由,那么你可能会想走那条路.我解决问题的方法是将Connection对象保存在模块级变量中,然后根据需要导入该变量.这样,它就可以在Flask 内使用,也可以由其他模块使用.以下是我所做工作的简化版本:

app.py

from flask import Flask
from extensions import neo4j

app = Flask(__name__)
neo4j.init_app(app)

extensions.py

from neo4j_db import Neo4j

neo4j = Neo4j()

neo4j_db.py

from neo4j import GraphDatabase

class Neo4j:
    def __init__(self):
        self.app = None
        self.driver = None

    def init_app(self, app):
        self.app = app
        self.connect()

    def connect(self):
        self.driver = GraphDatabase.driver('bolt://xxx')
        return self.driver

    def get_db(self):
        if not self.driver:
            return self.connect()
        return self.driver

example.py

from extensions import neo4j

driver = neo4j.get_db()

并且从这里起,driver将包含将跨Flask请求持久存在的数据库驱动程序.

希望这能帮助任何有同样问题的人.

Database相关问答推荐

如何使用 Gramex FormHandler 动态(在运行时)创建或更改数据库模式

如何在 Big Data 中进行模糊搜索

JOIN 三张表

无法使用命令行运行 liquibase

使用 ContentValues 和更新方法更新 sql 数据库

通过删除执行计划中的排序运算符来优化 SQL 查询

一个 5MB 的 SQL 数据库可以存储多少数据?

什么是表前缀?

使用存储过程是一种不好的做法吗?

Redis:数据库大小与内存的比率?

此平台不支持 LocalDB

在 Rails 中销毁/删除数据库

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

我如何做大于/小于使用 MongoDB?

PostgreSQL 唯一索引和字符串大小写

日期格式的 Oracle SQL 查询

在数据库中存储业务逻辑

如何使用 JPA 注释创建连接表?

与内连接相反

如何判断我的 heroku 数据库的记录?