Aller au contenu

$sql.update

Alias: $sql.create, $sql.delete

Description

Exécute une requête de type UPDATE, CREATE ou DELETE et retourne le nombre de lignes modifiées.

Mise à jour de dossier par SQL

Attention, les modifications apportées à un dossier par SQL ne sont pas automatiquement reprises au niveau du dossier chargé en mémoire. Cela peut amener à une désynchronisation entre les données de la base de données et celles du dossier chargé en mémoire dans la session.

Il est important de forcer le moteur à recharger les données mémoire à partir de la base de données au moyen de la méthode $data.reload.

Syntaxe

$sql.update( query [ , data [ , options ] ] )

Paramètres

query string
Requête à évaluer
data array / map / string / number / date / time / timestamp / file

Jeu de données à passer à la requête (dans le cas où la requête utilise la notation des prepared statements - ce qui est recommandé)

Le paramètre peut prendre plusieurs formes en fonction de la requête sur laquelle il doit s'appliquer:

  • Valeur null: La requête n'attend pas de paramètre ou n'utilise pas la syntaxe des prepared statement
  • Valeur litérale unique: La requête n'attend qu'un seul paramètre de type simple (string, number, date, time, timestamp ou file)
  • Tableau 1D: Dans ce cas, les valeurs du tableau sont reprises dans l'ordre comme valeurs pour le prepared statement.
  • Tableau 2D (tableau de tableau 1D) : La méthode comprend que l'on souhaite évaluer plusieurs fois la requête. Elle boucle sur les lots de données dans l'ordre et évalue la requête avec chacun des lots disponibles. Par exemple, si le tableau vaut [[1,2],[3,4]], la méthode va évaluer la requête 2 fois : la première fois avec les valeurs 1 et 2, et la seconde fois avec les valeur 3 et 4.
  • Map : Ce cas s'applique si la requête référence des paramètres nommés.
  • Tableau de map : Cette syntaxe permet de passer plusieurs jeux de données à la fois, en utilisant la notation avec des paramètres nommés. Dans ce cas, la méthode est évaluée autant de fois qu'il y a de maps dans le tableau.

Veuillez prendre connaissance de la note traitant de la valeur null dans la documentation de $sql.select.

options map

Map d'options supplémentaires. Les options reconnues sont:

batch boolean

Demande à la méthode d'exécuter le statement en tant que batch, avec auto-commit désactivé (un commit global est réalisé à la fin de traitement du batch).

Ce mode apporte un gain de performances significatif lorsqu'il s'agit de mettre à jour de grandes quantités de données (voir l'exemple 2 donné plus bas).

Par contre les data ne peuvent être fournis que sous la forme d'une matrice (c-à-d. un tableau de tableaux). Si les données contiennent des maps, le traitement ne sera pas effectué sous forme de batch.

En outre, la valeur de retour ne fournira pas de détail sur les traitement effectués. La méthode retourne simplement true.

timeout number
Temps maximum (en secondes) autorisé pour l'exécution de la requête
connection string
Nom de connexion de laquelle tirer les paramètres de connexion. Doit référencer une connexion définie dans le fichier de configuration
dumpLevel string
Cette option permet d'afficher la requête dans le log. La valeur de l'option doit désigner un niveau de log parmi (trace, debug, info, warn ou error)

Retour

Nombre de lignes modifiées.

Exemple

Exemple 1

$sql.update(`update Article set Description=? where idArticle=?`,
            [ "L'exemple", 1234 ]);

Exemple 2

Le code ci-dessous donne un exemple qui compare le temps d'exécution pour la mise à jour de 20'000 entrées sur une table.

// préparation du dataset
var data = [];
for (var i = 0; i < 20000; ++i) {
    data += [ 'Lastname-${i}', 'Firstname-${i}' ];
}

try {
    // création des données (en mode batch)
    $sql.update(`create table test_batch(lastname varchar(20), firstname varchar(20), foo varchar(20))`);
    $sql.insert(`insert into test_batch(lastname, firstname) values(?,?)`,
                data, { batch: true });

    $sql.update(`create index idx0 on test_batch(lastname)`);

    // préparation des données de mise à jour
    data = [];
    for (var i = 0; i < 20000; ++i) {
        data += [ 'Foo-${i}', 'Lastname-${i}' ];
    }

    // exécution standard
    var beg = $cal.timestamp();
    $sql.insert(`update test_batch set foo=? where lastname=?`,
                data, { batch: false });
    $logger.info("Exécution standard: " & $cal.diff(beg, $cal.timestamp(), "ms") & " ms");

    $sql.update(`update test_batch set foo=null`);

    // exécution batch
    var beg = $cal.timestamp();
    $sql.insert(`update test_batch set foo=? where lastname=?`,
                data, { batch: true });
    $logger.info("Exécution batch: " & $cal.diff(beg, $cal.timestamp(), "ms") & " ms");
}
finally {
    $sql.update(`drop table if exists test_batch`);
}

Le script génère les traces suivantes:

Exécution standard: 34851 ms
Exécution batch: 406 ms