Émulation des séquences sur SQLite
Émulation des séquences sur SQLite
Un DocType avec la règle de nommage autoincrement reçoit des noms entiers : 1, 2, 3… Sur MariaDB et PostgreSQL, Dodock prend la valeur suivante dans une séquence native de la base, avant l'insertion. SQLite n'a pas de séquences. Sur SQLite, Dodock les émule avec la table __frappe_sqlite_sequences.
Le module frappe.database.sequence garde la même interface pour les trois bases : create_sequence, get_next_val et set_next_val. Votre code n'a rien à changer selon la base.
La table __frappe_sqlite_sequences
Chaque ligne décrit une séquence :
| Colonne | Contenu |
|---|---|
name | Nom de la séquence, par exemple mon_doctype_id_seq |
current | Dernière valeur donnée |
increment | Pas de la séquence (1 par défaut) |
min_value, max_value | Bornes. Sans max_value, la séquence n'a pas de limite |
cycle | 1 si la séquence repart de min_value après max_value |
declared | 1 si create_sequence a créé la ligne, 0 si la ligne a été créée au premier usage |
L'installation d'un site crée la table (frappe/installer.py). Sur un site existant, un patch de frappe/patches.txt la crée lors de bench migrate.
Comportement
- Premier usage : si la séquence n'existe pas encore, Dodock la crée et la fait partir du plus grand nom entier déjà présent dans la table du DocType. Les nouveaux noms n'entrent donc pas en conflit avec les documents existants.
- Accès concurrents : chaque incrément est une seule requête
UPDATE … RETURNING. Deux insertions simultanées ne reçoivent jamais la même valeur. Cette requête demande SQLite 3.35 ou plus. - Séquence bornée : quand une séquence sans
cycleatteintmax_value,get_next_vallèvefrappe.db.SequenceGeneratorLimitExceeded. - Re-création :
create_sequencene remet pas à zéro une séquence déjà déclarée.
Exemple
Exemple fictif : un DocType Ticket Interne en autoincrement, sur un site SQLite qui contient déjà les tickets 1 à 41.
from frappe.database.sequence import get_next_val
get_next_val("Ticket Interne") # 42 au premier appel, puis 43, 44…
Limites
- L'émulation ajoute une requête par insertion d'un document en
autoincrement. - L'émulation concerne seulement SQLite. Elle ne change rien sur MariaDB ni sur PostgreSQL.