【问题标题】:KnexJS raw query not working as expectedKnexJS 原始查询未按预期工作
【发布时间】:2018-09-01 16:12:02
【问题描述】:

我有一个如下查询:

SET @count = 0; UPDATE table SET table.id = @count:= @count + 1 WHERE table.name = "name";

如果我通过控制台或 Jetbrains Datagrip 之类的工具执行它,它可以完美运行,但是当我通过 Knex 作为原始查询推送它时,它会以 mysql ER_PARSE_ERROR 响应。

我做了一些测试,似乎 Knex 不明白 @count 是什么。

有什么想法吗?如果可以使用 Knex 方法对其进行格式化,我将非常感谢这些提示

【问题讨论】:

  • 请发布您用于执行查询的 knex 代码。
  • return knex.raw('SET @count = 0; UPDATE table SET table.id = @count:= @count + 1 WHERE table.name = "name";');
  • Knex / driver 不支持一次将多个语句传递给 raw。如果你真的想这样做,你可以开始事务,先运行trx.raw('SET @count = 0'),然后运行trx.raw('UPDATE table SET table.id = @count:= @count + 1 WHERE table.name = "name"'),最后提交。
  • 以下事务根本没有通过。也没有错误输出

标签: javascript mysql node.js knex.js


【解决方案1】:

我想您可以将其编写为 Knex.js 查询,使用事务承诺来递增 count

var count = 0;
knex.transaction(function(trx){
    knex('table')
        .where('name', '=', 'name')
        .update(({
            id: count
        });
})
.then(()=>++count);

【讨论】:

  • 这几乎可以工作。它遍历所有条目,但不会增加 id。只需将所有内容设置为 0。
  • 然后从这个块的顶部删除count,并将其作为全局变量放在所有代码的顶部。这样它就不会在您每次尝试更新时重置。
  • 试过了,没有变化
  • 你能把你的整个js文件贴出来吗?您可能想查看 SQL 中自动递增生成的数字。
  • 我的意思是你发布的内容差不多,只是稍微格式化sortIds(name) { var count = 0; return knex.transaction((trx) => { knex('table').where({name: name}).update({id: count}); }).then(() => ++count); }
猜你喜欢
  • 2012-11-13
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多