Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Flask时Python中持久数据库连接的最佳实践_Python_Database_Flask_Database Connection_Pooling - Fatal编程技术网

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

使用Flask时Python中持久数据库连接的最佳实践,python,database,flask,database-connection,pooling,Python,Database,Flask,Database Connection,Pooling,我的问题是关于在生产环境或其他关注性能的环境中使用Flask时处理数据库连接的推荐方法。在Flask中,g对象可用于存储内容,并且可以将开放数据库连接放在那里,以允许应用程序在同一请求期间在后续数据库查询中重用它们。但是,g对象不会在请求之间持久化,因此似乎每个新请求都需要一个新的数据库连接(以及由此产生的性能影响) 我在这个问题上发现的最相关的问题是:但答案只提出了连接池的抽象概念(没有将它与如何在Flask中使用连接池以及如何在请求之间生存联系起来),或者提出了只与一种特定类型的数据库或特定

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

我在这个问题上发现的最相关的问题是:但答案只提出了连接池的抽象概念(没有将它与如何在Flask中使用连接池以及如何在请求之间生存联系起来),或者提出了只与一种特定类型的数据库或特定堆栈相关的解决方案

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


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

事实证明,有一种简单的方法可以实现我所追求的目标。但正如评论者所建议的,如果有可能走炼金术路线,那么你可能会想走这条路。我解决这个问题的方法是将连接对象保存在模块级变量中,然后根据需要导入该变量。这样,它将可用于烧瓶内和其他模块。以下是我所做工作的简化版本:

app.py

extensions.py

neo4j_db.py

示例.py

从这里开始,驱动程序将包含数据库驱动程序,该驱动程序将在Flask请求之间持久化


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

查看sqlalchemyUSE查看数据库部分此解决方案有效,我已在MongoDB上试用过。有人愿意详细说明它为什么有效吗?据我所知,从extensions导入neo4j将再次运行整个模块
extension.py
重新初始化
neo4j
变量。在Python中,“出于效率考虑,每个模块在每个解释器会话中只导入一次”根据此处,相关加载在Flask应用程序启动时发生一次,并从那时起保留在内存中。我正在使用postgres,我基本上是在Flask应用程序启动期间在
app.py
中启动psycopg2连接。到目前为止还没有遇到问题,并且在多个请求之间只维护了一个连接(AFAIK)。对这种解决方案有何评论?它和你的方法相似吗?你的方法也应该有效。但是,随着应用程序的增长(例如,使用更多类型的DB连接),您可能需要考虑在这里发布的模式,将其分解成多个文件,以便使应用程序更加结构化和模块化。@ OSPIDER,您可以简单地使用一个管理连接的库。例如,您可以使用sqlalchemy.pool中的QueuePool类。
from flask import Flask
from extensions import neo4j

app = Flask(__name__)
neo4j.init_app(app)
from neo4j_db import Neo4j

neo4j = Neo4j()
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
from extensions import neo4j

driver = neo4j.get_db()