2017-09-14 1 views
0

J'ai la requête suivante donc je peux copier quelques lignes dans la même table:Sails.js/Waterline des requêtes SQL signale une erreur de syntaxe quand il semble y avoir aucune erreur

START TRANSACTION; 
CREATE TEMPORARY TABLE IF NOT EXISTS copy AS SELECT * FROM table WHERE table.field= 'foo'; 
UPDATE copy SET copy.field = REPLACE(copy.field, 'foo', 'bar'); 
SELECT @id := MAX(table.uid) AS uid FROM table; 
UPDATE copy SET copy.uid = (@id:[email protected]+1); 
INSERT INTO table SELECT * FROM copy; 
COMMIT; 

Cela fonctionne parfaitement établi MySQL . J'ai alors couru la requête par Sails.js (en utilisant les voiles-mysql adaptateur) mais je reçois l'erreur:

{ Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TEMPORARY TABLE IF NOT EXISTS copy AS SELECT * FROM table WH' at line 1 

J'ai consigné la requête à la console et il semble bien. Pourquoi cela arriverait-il?

est ici le code de voiles:

copyTo: function (req, res) { 
    var from = req.param('from', ''); 
    var to = req.param('to', ''); 
    if (from === '' || to === '') { 
     res.send('from and to are required'); 
    } 

    var query = 'START TRANSACTION; CREATE TEMPORARY TABLE IF NOT EXISTS copy AS SELECT * FROM table WHERE table.field = \'' + from + '\'; UPDATE copy SET copy.field = REPLACE(copy.field, \'' + from + '\', \'' + to + '\'); SELECT @id := MAX(table.uid) AS uid FROM table; UPDATE copy SET copy.uid = (@id:[email protected]+1); INSERT INTO table SELECT * FROM copy; COMMIT;'; 

    Model.query(query, function (err, items) { 
     if (err) { 
     console.log(err); 
     res.send(400); 
     } else { 
     res.send('ok'); 
     } 
    }); 
    }, 

Le résultat est essentiellement une copie de la table temporaire réinsérés dans la table d'origine, avec la propriété sur le terrain a changé

+0

Pouvez-vous envoyer votre code Sails.js et le résultat de la requête connecté? – riza

+0

@riza a ajouté le code – anthozep

+0

[mysql-doc] (https://dev.mysql.com/doc/refman/5.7/fr/stored-programs-defining.html), essayez d'envelopper la requête dans quelque chose comme 'DELIMITER + \ n {votre-sql-ici} \ n + ' – birdspider

Répondre

-1

Voile seul travail pour une instruction de requête var = 'START TRANSACTION'; Model.query (requête, fonction (err, items) { ... });

mieux utiliser asyn.waterfall pour d'autres instruction de la requête

0

J'ai fini par faire juste une procédure stockée et de l'appeler de voiles