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

在一个项目上使用KnexJS,并且在整个项目中一直使用.raw()方法。

我现在有一种情况, .raw只是没有被构build到SQL中,所以syntax error at end of input错误结束时, syntax error at end of input 。 如果我转储的SQLstring,我可以看到为什么,因为它的失败

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

我可以看到为什么它有一个问题,我遇到的问题是返回是一个Raw值,所以我只是不知道为什么它没有被编译与SQL。

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

如果我使用一个string,而不是returning()方法中的rawstring,它将编译string。

如果我安慰knexQuery.raw('mytable::json')部分,它显示为一个Raw对象,具有正确的对象数据…

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

我知道SQL的工作,因为我填补了缺less的部分,它的工作原理,但SQL不是问题,我只是不知道为什么raw()方法没有被编译与SQLstring。

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

我开始认为这是代码中的一个错误,但是花了一个小时去了KnexJS库代码之后,我看不出有什么理由不起作用。

那么为什么这段代码不能将原始的信息生成到查询中,而我的另一个没有问题并且可以正常工作呢?

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

这是knex https://runkit.com/mikaelle/592412c3a631940012a51928中的错误,请在knex github中打开问题。 看起来像处理原始input只是没有对returning器方法实施。

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

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