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]; }); };
3 Réponses :
AND
, essayez le point-virgule ;
.select *
vous devez entrer le nom des colonnes, car plus tard, vous pouvez ajouter une nouvelle colonne, votre fonction ne s'exécute pas.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"
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])
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
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]; }); };