在一个项目上使用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构建到查询中,而我的另一条代码没有问题并且有效?
我已经到了我只想用其他东西解决问题的地步,但如果不使用这种方法就不可能。
答案 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();