Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

KNEX Undefined binding(s) detected when compiling SELECT query

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);
});

It throws

Undefined binding(s) detected when compiling SELECT query.

It is working fine with 0.11.5, it stopped working with 0.11.6 onwards. I am pointing to 0.13.0 right now.

useNullAsDefault: true

works fine with insert queries but not select queries. Is there any flag i should pass to resolve this error?

like image 623
Mrugesh Vaghela Avatar asked Jul 11 '17 06:07

Mrugesh Vaghela


2 Answers

.where('id', undefined) does not mean anything in SQL. You cannot be querying something that is not there.

Maybe you wanted to query where id IS NULL? With knex it can be done like this: .whereNull('id')

With earlier knex versions it would have been just ignored, but starting from 0.12.x.

So to have equivalent functionality with newer (and actually it is compatible with older < 0.12 versions too) knex versions you should do:

SKU.fetch().then(function (skus) {
    if (skus) console.log(skus.toJSON());
}).catch(function (err) {
    console.error(err);
});

Unless bookshelf is adding some extra magic there...

The useNullAsDefault: true option Is used only for when inserting multiple rows in one insert. It does not make sense to use it unless you are using sqlite (check last example of http://knexjs.org/#Builder-insert).

like image 87
Mikael Lepistö Avatar answered Nov 15 '22 19:11

Mikael Lepistö


the parameter which sql query is expecting and the parameter you sending in requestbody is not matching. in my case sql was expecting parameter "gradeId" but in requestBody i was sending "postId"

like image 30
Aayush Bhattacharya Avatar answered Nov 15 '22 21:11

Aayush Bhattacharya