我的问题是在生产环境或性能受到关注的其他环境中使用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如何解决跨请求持久性的基本问题?
事实证明,有一种直接的方式来实现我的目标。但是,正如评论者所说,如果完全可以去烧瓶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请求中保持不变的数据库驱动程序。
希望能帮助任何有同样问题的人。