Aller au contenu

Le SQL d'insertion

Objectif : voir le SQL d'insertion d'un événement avant de l'exécuter.

Ce que vous allez apprendre : get_track_event_sql retourne l'INSERT paramétré ; prepare_track_event_values retourne le tuple de valeurs d'un événement (métadonnées sérialisées en JSON).
SQL visible, requête paramétrée (anti-injection).

Premier palier du niveau intermédiaire de la progression stats.

Module opt-in

Ce starter suppose forge-mvc-stats installé.

Ce que ce starter montre

  • get_track_event_sql() → l'INSERT ;
  • prepare_track_event_values(event) → le tuple de valeurs ;
  • une transformation pure (on montre, on n'exécute pas).

Classes Forge utilisées

Classe / fonction Rôle dans ce starter Référence
forge_mvc_stats.get_track_event_sql L'INSERT paramétré. Stats
forge_mvc_stats.prepare_track_event_values Le tuple de valeurs d'un événement. Stats

Tester

forge run

Ouvrez https://localhost:8000/stats-track-sql : l'INSERT et ses valeurs.

Le contrôleur

# mvc/controllers/stats_track_sql_controller.py
from core.http.request import Request
from core.http.response import Response
from core.mvc.controller.base_controller import BaseController

from forge_mvc_stats import get_track_event_sql, make_event, prepare_track_event_values


class StatsTrackSqlController(BaseController):

    @staticmethod
    def index(request: Request) -> Response:
        event = make_event("page_view", "Vue de page", "navigation", {"path": "/"})
        return BaseController.render(
            "stats_track_sql/index.html",
            context={
                "sql": get_track_event_sql(),
                "values": list(prepare_track_event_values(event)),
            },
            request=request,
        )

page_view est ici un nom, pas un type

Ce parcours se sert de cette chaîne comme d'un nom d'événement quelconque, et c'est légitime.

Une consultation de page se déclare autrement, par kind=KIND_PAGE_VIEW, le nom restant celui de la page consultée.
Employer "page_view" comme nom rangerait toutes les pages sous un seul nom, et l'axe qui répond « quelles pages reviennent le plus » ne répondrait plus rien.

Comprendre ce code

  • Le SQL est paramétré (?) : les valeurs ne sont jamais concaténées (anti-injection).
  • Les métadonnées (dict) sont sérialisées en JSON pour tenir dans une colonne texte.
  • Voir le SQL avant de l'exécuter rend le comportement transparent (SQL visible).

La vue

<!-- mvc/views/stats_track_sql/index.html -->
<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Le SQL d'insertion - Forge</title>
</head>
<body>
  <h1>Le SQL d'insertion</h1>

  <p>Requête <code>INSERT</code> paramétrée (SQL visible) :</p>
  <pre><code>{{ sql }}</code></pre>

  <p>Valeurs pour l'événement de démo :</p>
  <ul>
    {% for value in values %}<li><code>{{ value }}</code></li>{% endfor %}
  </ul>

  <p>Les <code>?</code> sont des paramètres liés (anti-injection) ; les métadonnées
  sont sérialisées en JSON.</p>
</body>
</html>

La route

Dans mvc/routes/__init__.py, ajoutez l'import en tête de fichier et la route dans le groupe public.

# mvc/routes/__init__.py
from mvc.controllers.stats_track_sql_controller import StatsTrackSqlController

with router.group("", public=True) as public:
    public.add("GET", "/stats-track-sql", StatsTrackSqlController.index, name="stats_track_sql_index")

À retenir

  • get_track_event_sql + prepare_track_event_values = SQL + valeurs, sans exécuter.
  • Requête paramétrée, métadonnées en JSON.
  • Transparence : on lit ce qui sera écrit.

Après ce starter

La suite : exécuter cet enregistrement.

Enregistrer un événement