2
votes

Erreur: impossible d'insérer plusieurs commandes dans une instruction préparée

J'essaye de déplacer une ligne d'une table à une autre.

Le problème est que si je mets les deux requêtes ensemble, j'obtiens "erreur: impossible d'insérer plusieurs commandes dans une instruction préparée". Que puis-je faire?

exports.deletePost = function(id) {
    return db.query(`INSERT INTO deletedjobs
    SELECT *
    FROM jobs
    WHERE id = $1;

    DELETE FROM jobs WHERE id = $1;`, [id]).then(results => {
        console.log("succesfull transfer");
        return results.rows[0];
    });
};


0 commentaires

3 Réponses :


0
votes
  • Vous ne devriez peut-être pas utiliser la clause AND , essayez le point-virgule ; .
  • Vous avez utilisé select * vous devez entrer le nom des colonnes, car plus tard, vous pouvez ajouter une nouvelle colonne, votre fonction ne s'exécute pas.

1 commentaires

mais lorsque j'utilise un point-virgule, c'est que j'obtiens cette erreur "erreur: impossible d'insérer plusieurs commandes dans une instruction préparée"



0
votes

EDIT: Suite à Docs v7.0.0, j'ai découvert que db.multi pouvait exécuter une chaîne multi-requête, vous pouvez essayer ceci:

db.any('select moveJob($1)', [id]);

Une autre façon, je pense que la meilleure solution est que vous devez envelopper la requête dans une fonction pour insérer-supprimer en même temps, comme ci-dessous:

CREATE FUNCTION moveJob(id character varying) RETURNs void AS
$BODY$
BEGIN
    INSERT INTO deletedjobs
    SELECT *
    FROM jobs
    WHERE id = id;

    DELETE FROM jobs WHERE id = id;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;

Et appelez-le comme fonction postgresql dans votre js:

db.multi(`INSERT INTO deletedjobs
    SELECT *
    FROM jobs
    WHERE id = $1;DELETE FROM jobs WHERE id = $1`, [id])


6 commentaires

Merci ThnhPhan. Je viens d'essayer votre solution mise à jour mais j'ai "db.multi n'est pas une fonction"


J'ai également essayé d'exécuter la fonction dans mon terminal psql, mais j'ai eu "ERREUR: le type de résultat de la fonction doit être spécifié": /


J'ai déjà mis à jour le retour en fonction, pouvez-vous réessayer


Merci Thanh, maintenant j'ai créé la fonction, malheureusement j'obtiens db.multi / db.any n'est pas une fonction parce que j'utilise ce spicedPg npm au lieu de pg-promise.


Mes réponses sont basées sur pg-promise , il est populaire de se connecter à PostgreSQL, vous devriez l'utiliser


Merci, je vais vérifier



0
votes

Vous pouvez également utiliser une clause WITH ... AS ( https://www.postgresql.org/docs/9.1/queries-with.html ) pour exécuter les deux requêtes en une seule fois. Cela pourrait donc ressembler à quelque chose comme ça:

exports.deletePost = function(id) {
return db.query(`
  WITH 
    A AS (SELECT * FROM jobs WHERE id = $1), 
    B AS (INSERT INTO deletedjobs FROM A),
    DELETE FROM jobs WHERE id IN (SELECT id FROM A);
`, [id]).then(results => {
    console.log("succesfull transfer");
    return results.rows[0];
});
};


0 commentaires