# Magasin de données

Enregistre et relit des lignes dans une table Yokk. Aucune base à créer, aucun
DSN à coller, aucun SQL à écrire : vous déclarez une fois une table et ses
champs dans **Production › Données**, et ce nœud les lit et les écrit.

Contrairement à **Set state** et à **Memory manager**, qui ne vivent que le
temps d'une exécution, les lignes du magasin de données survivent aux
exécutions et sont partagées par tout l'espace de travail.

## Déclarer la table d'abord

Une table se déclare dans **Production › Données** avec un nom et une liste de
champs. Chaque champ a un type — texte, nombre, oui/non, date, date et heure,
choix, e-mail ou URL — et peut être marqué **obligatoire** ou **unique**. Une
table peut aussi être marquée **en ajout seul** : ses lignes ne peuvent alors
qu'être ajoutées et lues, jamais modifiées ni supprimées, ce qui la rend
utilisable comme journal d'audit.

Le nœud lit cette définition. Il ne crée jamais de table et n'invente jamais de
champ.

## Configuration

Tout est visuel : on choisit la table, puis l'opération, puis on mappe les
champs déclarés un par un. Ce nœud ne comporte aucun éditeur JSON.

| Opération | Effet |
| --- | --- |
| Insérer une ligne | Ajoute toujours une ligne. Refusée si un champ unique contient déjà la valeur. |
| Insérer ou mettre à jour | Met à jour la ligne dont les champs **uniques** contiennent déjà ces valeurs, ou la crée. |
| Rechercher des lignes | Renvoie les lignes correspondantes, les plus récentes d'abord par défaut. |
| Mettre à jour des lignes | Ne modifie que les champs mappés, sur les lignes correspondantes. |
| Supprimer des lignes | Marque les lignes comme supprimées — rien n'est effacé. |
| Compter des lignes | Renvoie le nombre de lignes correspondantes, sans les charger. |
| Augmenter un nombre | Ajoute un montant à un champ numérique, sans perte en cas de concurrence. |

Les valeurs acceptent les expressions habituelles du constructeur, par exemple
`{event.body.email}`, `{state.customer.id}` ou
`{outputs.score.parsed.value}`. Les champs déclarés en choix ou en oui/non
disposent d'un sélecteur ; le bouton **fx** à côté bascule vers une expression.

### Trouver une ligne existante

Insérer ou mettre à jour ne laisse pas choisir les champs de correspondance :
la ligne est identifiée par les champs déclarés **uniques** sur la table, et
l'index de la base le fait respecter. Mappez ces champs dans les valeurs ; le
nœud vous indique lesquels ce sont.

### Conditions

Mettre à jour, Supprimer, Compter et Augmenter s'appuient sur une liste de
conditions construites à partir des champs déclarés (est, n'est pas, contient,
supérieur à, est vide…). Mettre à jour, Supprimer et Augmenter exigent au moins
une condition, pour ne jamais porter par accident sur toute la table.

### Seulement si la ligne contient encore…

Mettre à jour et Augmenter acceptent une vérification facultative. L'écriture
n'est appliquée que si la ligne contient encore les valeurs indiquées ; sinon
elle est refusée et rien ne change. C'est ce qui empêche deux opérateurs de
s'écraser silencieusement — par exemple pour garantir qu'un compteur ne peut
que monter.

## Sortie runtime

Le nœud écrit son résultat principal dans `last_output` et, quand la sortie
est structurée, dans `last_output_parsed`. Les nœuds aval peuvent référencer
les sorties nommées via `{outputs.<node_id>.parsed}` :

- `records` — les lignes renvoyées par Rechercher, ou modifiées par Mettre à jour
- `record` — la ligne écrite par Insérer, Insérer ou mettre à jour, ou Augmenter
- `count` — le nombre de lignes correspondantes ou affectées
- `created` — pour Insérer ou mettre à jour, si une nouvelle ligne a été créée

## En cas de refus

Le nœud explique ce qui s'est passé en langage clair, pas en trace technique :

- l'espace de travail a atteint son quota de lignes ou de stockage, avec la limite atteinte
- un champ unique contient déjà cette valeur
- la table est en ajout seul, la modification ou la suppression est refusée
- la vérification ne correspond plus, l'écriture n'a pas été appliquée

## Exemple workflow

Utilisez la carte workflow ci-dessous pour créer un exemple fonctionnel dans
l'éditeur. Ouvrez chaque nœud Magasin de données et choisissez votre table : le
mapping des champs est alors lu depuis sa définition.

---

*Source: https://agentbuilder.systalink.sn/docs/node-data-store — human documentation.*
*Other language: [/docs-md/en/node-data-store.md](/docs-md/en/node-data-store.md).*
*Machine-readable index: [/llms.txt](/llms.txt).*
