Version de développement
Cette documentation décrit la version « next » (develop), non encore publiée. Pour la version stable, basculez sur « v5 » dans l'en-tête.
Développeurs

Émulation des séquences sur SQLite

Sur une base SQLite, Dodock émule les séquences des DocTypes nommés en autoincrement avec la table __frappe_sqlite_sequences.

É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 :

ColonneContenu
nameNom de la séquence, par exemple mon_doctype_id_seq
currentDernière valeur donnée
incrementPas de la séquence (1 par défaut)
min_value, max_valueBornes. Sans max_value, la séquence n'a pas de limite
cycle1 si la séquence repart de min_value après max_value
declared1 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 cycle atteint max_value, get_next_val lève frappe.db.SequenceGeneratorLimitExceeded.
  • Re-création : create_sequence ne 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.