KnexJS 原始方法在一种情况下不起作用

KnexJS Raw Method doesn't work in one case

在项目中使用 KnexJS,并且在整个项目中一直使用 .raw() 方法,没有出现任何问题。

我现在遇到一种情况,其中 .raw 没有内置到 SQL 中,所以我最终遇到了 syntax error at end of input 错误。如果我转储 SQL 字符串,我就能明白为什么它会失败

'update "mytable" set "a" = ? returning '

我明白为什么它有问题,我遇到的问题是返回的是一个 Raw 值,所以我无法弄清楚为什么它没有被编译SQL.

knexQuery.update(data).into('mytable').returning( knexQuery.raw('mytable::json') );`

如果我使用字符串代替 returning() 方法中的 raw,它会将字符串编译到其中。

如果我调出 knexQuery.raw('mytable::json') 部分,它显示为原始对象,具有正确的对象数据...

Raw {
 client: 
  Client_PG {
    ... },
 sql: 'mytable::json',
 bindings: undefined,
 _wrappedBefore: undefined,
 _wrappedAfter: undefined,
 _debug: undefined } }

我知道 SQL 有效,因为我已经填写了缺失的部分并且它有效,但是 SQL 不是问题,我只是不明白为什么raw() 方法未使用 SQL 字符串进行编译。

我的代码中的其他地方还有另一段代码(和 INSERT 一段代码)使用相同的 returning( knexQuery.raw(....) ) 并且工作得很好。

我开始认为这是代码中的一个错误,但在花了一个小时浏览 KnexJS 库代码后,我看不出有任何原因无法正常工作。

那么为什么这段代码没有将原始代码构建到查​​询中,而我的另一个代码没有问题并且可以工作?

我已经到了我只想使用其他方法来解决问题的地步,但如果不使用这种方法是不可能的。

这是 knex 中的错误 https://runkit.com/mikaelle/592412c3a631940012a51928 请在 knex github 中打开问题。看起来处理原始输入还没有实现到 returning 构建器方法。

无论如何看起来这是一种解决方法:

knex('TestTable')
  .insert({ foo: 'bar' })
  .returning([knex.raw('mytable::json')]) // raw wrapped in array
  .toSQL();