[{"data":1,"prerenderedAt":301},["ShallowReactive",2],{"\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsequences-sqlite":3,"section:\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsequences-sqlite":300},{"id":4,"title":5,"body":6,"description":286,"extension":287,"meta":288,"navigation":253,"path":296,"seo":297,"stem":298,"__hash__":299},"docs\u002F2.next\u002F3.dodock\u002F10.developpeurs\u002Fsequences-sqlite.md","Émulation des séquences sur SQLite",{"type":7,"value":8,"toc":279},"minimark",[9,13,26,45,52,55,152,166,170,217,221,231,261,265,275],[10,11,5],"h1",{"id":12},"émulation-des-séquences-sur-sqlite",[14,15,16,17,21,22,25],"p",{},"Un DocType avec la règle de nommage ",[18,19,20],"code",{},"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 ",[18,23,24],{},"__frappe_sqlite_sequences",".",[14,27,28,29,32,33,36,37,40,41,44],{},"Le module ",[18,30,31],{},"frappe.database.sequence"," garde la même interface pour les trois bases : ",[18,34,35],{},"create_sequence",", ",[18,38,39],{},"get_next_val"," et ",[18,42,43],{},"set_next_val",". Votre code n'a rien à changer selon la base.",[46,47,49,50],"h2",{"id":48},"la-table-__frappe_sqlite_sequences","La table ",[18,51,24],{},[14,53,54],{},"Chaque ligne décrit une séquence :",[56,57,58,71],"table",{},[59,60,61],"thead",{},[62,63,64,68],"tr",{},[65,66,67],"th",{},"Colonne",[65,69,70],{},"Contenu",[72,73,74,88,98,108,124,139],"tbody",{},[62,75,76,82],{},[77,78,79],"td",{},[18,80,81],{},"name",[77,83,84,85],{},"Nom de la séquence, par exemple ",[18,86,87],{},"mon_doctype_id_seq",[62,89,90,95],{},[77,91,92],{},[18,93,94],{},"current",[77,96,97],{},"Dernière valeur donnée",[62,99,100,105],{},[77,101,102],{},[18,103,104],{},"increment",[77,106,107],{},"Pas de la séquence (1 par défaut)",[62,109,110,118],{},[77,111,112,36,115],{},[18,113,114],{},"min_value",[18,116,117],{},"max_value",[77,119,120,121,123],{},"Bornes. Sans ",[18,122,117],{},", la séquence n'a pas de limite",[62,125,126,131],{},[77,127,128],{},[18,129,130],{},"cycle",[77,132,133,134,136,137],{},"1 si la séquence repart de ",[18,135,114],{}," après ",[18,138,117],{},[62,140,141,146],{},[77,142,143],{},[18,144,145],{},"declared",[77,147,148,149,151],{},"1 si ",[18,150,35],{}," a créé la ligne, 0 si la ligne a été créée au premier usage",[14,153,154,155,158,159,162,163,25],{},"L'installation d'un site crée la table (",[18,156,157],{},"frappe\u002Finstaller.py","). Sur un site existant, un patch de ",[18,160,161],{},"frappe\u002Fpatches.txt"," la crée lors de ",[18,164,165],{},"bench migrate",[46,167,169],{"id":168},"comportement","Comportement",[171,172,173,181,191,208],"ul",{},[174,175,176,180],"li",{},[177,178,179],"strong",{},"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.",[174,182,183,186,187,190],{},[177,184,185],{},"Accès concurrents"," : chaque incrément est une seule requête ",[18,188,189],{},"UPDATE … RETURNING",". Deux insertions simultanées ne reçoivent jamais la même valeur. Cette requête demande SQLite 3.35 ou plus.",[174,192,193,196,197,199,200,36,202,204,205,25],{},[177,194,195],{},"Séquence bornée"," : quand une séquence sans ",[18,198,130],{}," atteint ",[18,201,117],{},[18,203,39],{}," lève ",[18,206,207],{},"frappe.db.SequenceGeneratorLimitExceeded",[174,209,210,213,214,216],{},[177,211,212],{},"Re-création"," : ",[18,215,35],{}," ne remet pas à zéro une séquence déjà déclarée.",[46,218,220],{"id":219},"exemple","Exemple",[14,222,223,224,227,228,230],{},"Exemple fictif : un DocType ",[18,225,226],{},"Ticket Interne"," en ",[18,229,20],{},", sur un site SQLite qui contient déjà les tickets 1 à 41.",[232,233,238],"pre",{"className":234,"code":235,"language":236,"meta":237,"style":237},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from frappe.database.sequence import get_next_val\n\nget_next_val(\"Ticket Interne\")  # 42 au premier appel, puis 43, 44…\n","python","",[18,239,240,248,255],{"__ignoreMap":237},[241,242,245],"span",{"class":243,"line":244},"line",1,[241,246,247],{},"from frappe.database.sequence import get_next_val\n",[241,249,251],{"class":243,"line":250},2,[241,252,254],{"emptyLinePlaceholder":253},true,"\n",[241,256,258],{"class":243,"line":257},3,[241,259,260],{},"get_next_val(\"Ticket Interne\")  # 42 au premier appel, puis 43, 44…\n",[46,262,264],{"id":263},"limites","Limites",[171,266,267,272],{},[174,268,269,270,25],{},"L'émulation ajoute une requête par insertion d'un document en ",[18,271,20],{},[174,273,274],{},"L'émulation concerne seulement SQLite. Elle ne change rien sur MariaDB ni sur PostgreSQL.",[276,277,278],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":237,"searchDepth":244,"depth":250,"links":280},[281,283,284,285],{"id":48,"depth":250,"text":282},"La table __frappe_sqlite_sequences",{"id":168,"depth":250,"text":169},{"id":219,"depth":250,"text":220},{"id":263,"depth":250,"text":264},"Sur une base SQLite, Dodock émule les séquences des DocTypes nommés en autoincrement avec la table __frappe_sqlite_sequences.","md",{"icon":289,"reviewed":253,"last_verified":290,"sources":291},"i-mdi-database-cog","2026-11-03",[292,293,294,295],"dodock@develop:frappe\u002Fdatabase\u002Fsequence.py","dodock@develop:frappe\u002Fdatabase\u002Fsqlite\u002Fdatabase.py","dodock@develop:frappe\u002Finstaller.py","dodock@develop:frappe\u002Fpatches.txt","\u002Fnext\u002Fdodock\u002Fdeveloppeurs\u002Fsequences-sqlite",{"title":5,"description":286},"2.next\u002F3.dodock\u002F10.developpeurs\u002Fsequences-sqlite","cRNlmi-PSlj3dj000mlKFr35rcA48sOyrWkvnWPs97Q",{},1793871751933]