Лучшие практики для постоянных соединений с базой данных в Python при использовании Flask - PullRequest
1 голос
/ 04 апреля 2019

Мой вопрос касается рекомендуемого подхода для обработки соединений с базой данных при использовании Flask в производственной среде или другой среде, где важна производительность. Во Flask данный объект доступен для хранения вещей, и там можно разместить открытые соединения с базой данных, чтобы приложение могло повторно использовать их в последующих запросах к базе данных во время того же запроса. Однако данный объект не сохраняется в запросах, поэтому кажется, что для каждого нового запроса требуется новое подключение к базе данных (и это приводит к снижению производительности).

Наиболее похожий вопрос, который я нашел по этому вопросу, такой: Как сохранить соединение с базой данных на веб-сервере Python , но ответы только поднимают абстрактную идею пула соединений (без привязки к тому, как может использовать его в Flask и как оно будет действовать при разных запросах) или предложить решение, которое относится только к одному конкретному типу базы данных или определенному стеку.

Так что мой вопрос касается общего подхода, который следует использовать при создании приложений, построенных на Flask, которые подключаются к любой базе данных. Кажется, что что-то, связанное с пулом соединений, идет в правильном направлении, тем более что это будет работать для традиционного приложения Python. Но мне интересно, каков рекомендуемый подход при использовании Flask из-за вышеупомянутых проблем сохранения постоянства между соединениями, а также из-за того факта, что приложения Flask в работе запускаются с серверов WSGI, что потенциально добавляет дополнительные сложности.

РЕДАКТИРОВАТЬ: На основе комментариев, рекомендующих колбу sqlalchemy. Предполагая, что flask sqlalchemy решает проблему, он также работает для Neo4J или любой другой произвольной базы данных, которую использует приложение Flask? Многие из существующих коннекторов баз данных уже изначально поддерживают пул, поэтому зачем вводить дополнительную зависимость, основной целью которой является предоставление возможностей ORM, а не управление соединениями? Кроме того, как sqlalchemy справляется с фундаментальной проблемой постоянства запросов?

1 Ответ

1 голос
/ 05 апреля 2019

Оказывается, есть простой способ достичь того, чего я добился. Но, как предложили комментаторы, если вообще возможно пойти по пути склянки, тогда вы можете пойти по этому пути. Мой подход к решению проблемы заключается в сохранении объекта подключения в переменной уровня модуля, которая затем импортируется по мере необходимости. Таким образом, он будет доступен для использования из 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()

И отсюда драйвер будет содержать драйвер базы данных, который будет сохраняться при запросах Flask.

Надеюсь, это поможет любому, у кого такая же проблема.

...