当似乎没有错误时,Sails.js / Waterline原始SQL查询报告语法错误

时间:2017-09-14 23:01:47

标签: mysql sails.js waterline

我有以下查询,所以我可以将一些行复制到同一个表中:

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:=@id+1);
INSERT INTO table SELECT * FROM copy;
COMMIT;

这在MySQL工作台中完美运行。然后我通过Sails.js运行查询(使用sails-mysql适配器),但是我收到错误:

{ 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

我已将查询记录到控制台,看起来很好。为什么会这样?

这是帆的代码:

  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:=@id+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');
      }
    });
  },  

结果本质上是重新插入原始表的临时表的副本,字段属性已更改

2 个答案:

答案 0 :(得分:0)

我最终只是制作了一个存储过程并从sails中调用它

答案 1 :(得分:-1)

Sail仅适用于一个声明 var query ='START TRANSACTION'; Model.query(query,function(err,items){      ...     });

更好地使用asyn.waterfall进行其他语句查询