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];
});
};