使用Flask时Python中持久数据库连接的最佳实践

问题描述 投票:0回答:1

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

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

所以我的问题是关于在Flask上构建连接到任何类型数据库的应用程序时应采取的一般方法。似乎涉及连接池的东西是正确的方向,特别是因为这适用于传统的Python应用程序。但是我想知道使用Flask时推荐的方法是什么,因为上面提到的连接持久性问题,以及生产中的Flask应用程序是从WSGI服务器运行的事实,这可能会增加更多的复杂性。

编辑:基于评论推荐flask sqlalchemy。假设flask sqlalchemy解决了这个问题,它是否适用于Neo4J或Flask应用程序使用的任意数据库?许多现有的数据库连接器本身都支持池化,那么为什么要引入一个额外的依赖项,其主要目的是提供ORM功能而不是连接管理?另外,sqlalchemy如何解决跨请求持久性的基本问题?

python database flask database-connection pooling
1个回答
1
投票

事实证明,有一种直接的方式来实现我的目标。但是,正如评论者所说,如果完全可以去烧瓶sqlalchemy路线,那么你可能想要这样做。我解决问题的方法是将连接对象保存在模块级变量中,然后根据需要导入该变量。这样它就可以在Flask内部和其他模块中使用。这是我所做的简化版本:

app.朋友

from flask import Flask
from extensions import neo4j

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

extensions.朋友

from neo4j_db import Neo4j

neo4j = Neo4j()

neo4就_都不.朋友

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.朋友

from extensions import neo4j

driver = neo4j.get_db()

从这里开始,驱动程序将包含将在Flask请求中保持不变的数据库驱动程序。

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

© www.soinside.com 2019 - 2024. All rights reserved.