编译 SELECT 查询时检测到 KNEX 未定义的绑定

Mru*_*ela 5 javascript node.js bookshelf.js knex.js

var knex = require('knex')(config);
var bookshelf = require('bookshelf')(knex);
var SKU = bookshelf.Model.extend({
    tableName: 'skus',

});
SKU.where('id', undefined).fetch().then(function (skus) {
    if (skus) console.log(skus.toJSON());
}).catch(function (err) {
    console.error(err);
});
Run Code Online (Sandbox Code Playgroud)

它抛出

Undefined binding(s) detected when compiling SELECT query.
Run Code Online (Sandbox Code Playgroud)

它在 0.11.5 上运行良好,从 0.11.6 开始它停止工作。我现在指的是 0.13.0。

useNullAsDefault: true
Run Code Online (Sandbox Code Playgroud)

适用于插入查询但不适用于选择查询。我应该通过任何标志来解决这个错误吗?

Mik*_*stö 9

.where('id', undefined)在 SQL 中没有任何意义。你不能查询不存在的东西。

也许你想查询where id IS NULL?使用 knex 可以这样做:.whereNull('id')

对于较早的 knex 版本,它会被忽略,但从 0.12.x 开始。

因此,要与较新的(实际上它也与较旧的 < 0.12 版本兼容)knex 版本具有相同的功能,您应该执行以下操作:

SKU.fetch().then(function (skus) {
    if (skus) console.log(skus.toJSON());
}).catch(function (err) {
    console.error(err);
});
Run Code Online (Sandbox Code Playgroud)

除非书架在那里添加了一些额外的魔法......

useNullAsDefault: true选项仅用于在一次插入中插入多行。除非您使用 sqlite(检查http://knexjs.org/#Builder-insert 的最后一个示例),否则使用它是没有意义的。