KnexJS原始方法在一个案例

时间:2017-05-23 08:29:39

标签: node.js knex.js

在一个项目上使用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') );`

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

如果我控制出knexQuery.raw('mytable::json')部分,它会显示为Raw对象,并带有正确的对象数据......

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

我知道SQL工作正常,因为我填写了缺失的部分并且它有效,但SQL不是问题,我只是无法弄清楚为什么raw()方法没有用SQL字符串编译。

我的代码中还有另一段代码(和INSERT一个),它使用相同的returning( knexQuery.raw(....) )并且完全正常。

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

那么为什么这段代码没有将raw构建到查询中,而我的另一条代码没有问题并且有效?

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

1 个答案:

答案 0 :(得分:0)

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

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

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