[Bug] get_nf_db() — fuite de connexions SQLite en contexte hors-request #25

Closed
opened 2026-08-05 11:04:13 -04:00 by NixCyRy · 0 comments
NixCyRy commented 2026-08-05 11:04:13 -04:00 (Migrated from github.com)

Problème

get_nf_db() dans extensions.py crée une nouvelle connexion SQLite à chaque appel sans utiliser le contexte de requête Flask (g). Contrairement à get_db() qui stocke proprement la connexion dans g.

Dans utils/foods_helpers.py:_save_season_and_deals, la fonction appelle get_nf_db() puis db.close() manuellement. Si une exception se produit avant db.close(), la connexion fuit.

En contexte hors-request (ex: load_foods() appelé depuis le thread de background deals), il n'y a pas de teardown Flask — les connexions ne sont jamais fermées.

Fix

Option A — Stocker dans g comme get_db() :

def get_nf_db():
    if "nf_db" not in g:
        g.nf_db = sqlite3.connect(NF_DB_PATH)
        g.nf_db.row_factory = sqlite3.Row
    return g.nf_db

Option B — Context manager systématique :

from contextlib import closing
with closing(get_nf_db()) as db:
    # ...

Fichiers affectés

  • backend/extensions.py:get_nf_db()
  • backend/utils/foods_helpers.py — _save_season_and_deals, load_foods
  • backend/blueprints/foods.py — plusieurs routes

Sévérité

🔴 Critical — fuite de ressources serveur.

## Problème `get_nf_db()` dans `extensions.py` crée une **nouvelle connexion SQLite à chaque appel** sans utiliser le contexte de requête Flask (`g`). Contrairement à `get_db()` qui stocke proprement la connexion dans `g`. Dans `utils/foods_helpers.py:_save_season_and_deals`, la fonction appelle `get_nf_db()` puis `db.close()` manuellement. Si une exception se produit avant `db.close()`, la connexion fuit. En contexte hors-request (ex: `load_foods()` appelé depuis le thread de background deals), il n'y a pas de teardown Flask — les connexions ne sont jamais fermées. ## Fix Option A — Stocker dans `g` comme `get_db()` : ```python def get_nf_db(): if "nf_db" not in g: g.nf_db = sqlite3.connect(NF_DB_PATH) g.nf_db.row_factory = sqlite3.Row return g.nf_db ``` Option B — Context manager systématique : ```python from contextlib import closing with closing(get_nf_db()) as db: # ... ``` ## Fichiers affectés - `backend/extensions.py:get_nf_db()` - `backend/utils/foods_helpers.py` — `_save_season_and_deals`, `load_foods` - `backend/blueprints/foods.py` — plusieurs routes ## Sévérité 🔴 Critical — fuite de ressources serveur.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
SlopVibe-org/nutri-food#25
No description provided.