Knex不返回插入ID

时间:2017-04-18 06:38:58

标签: mysql node.js knex.js

这是我的表(CELLID)结构。

+---------+------------+------+-----+---------+-------+
| Field   | Type       | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| CELL_ID | int(11)    | NO   | PRI | NULL    |       |
| STATUS  | tinyint(4) | NO   |     | NULL    |       |
+---------+------------+------+-----+---------+-------+

这是我要插入表格的代码。

knex('CELLID').insert(insertObj)
    .then(function (result) {
      _log.info(reqContainer.uuid, "Successfully Added To CELLID||", result)
      // respond back to request
      _log.info(reqContainer.uuid, "Exiting CELLID_S");
      return resolve(result)  // respond back to request
    })
    .catch(function (err) {

      _log.error(reqContainer.uuid, "Failed Adding To CELLID ||", err)
      _log.error(reqContainer.uuid, "Exiting CELLID_S");
      // respond back to request
      return reject(Error("Failed Adding CELLID"));
    })

成功插入后,必须返回Id。在我的情况下,这不会发生。我总是在插入时获得0和Id为0.

我尝试过添加一个额外的列,自动增加主键ID(将CELL_ID删除为PK)。在这种情况下,我得到ID(自动增量值)。

我在这里缺少什么?

感谢。

6 个答案:

答案 0 :(得分:5)

您必须将第二个参数传递给insert方法,该方法指定要从中检索值的列。

在你的情况下它应该是这样的:

knex('CELLID').insert(insertObj, 'CELL_ID')
    .then(function (result) {
        // ...
    })

答案 1 :(得分:1)

要返回刚刚插入的记录的ID,请使用以下语法。

addCarMake:function(model,callback){     返回db.insert(model).into('car_make')。returning(“ make_id”)。then(function(id){

    console.log("make_id===="+JSON.stringify(id));
      id2:Number=id;
   // callback(null,id);
   return db('car_make')
   .where('make_id',id[0]).first();

    // return db.raw('select * from car_make where make_id=?',id)

})

但是返回的id是数组形式,因此请始终使用id [0]对其进行进一步的处理。

答案 2 :(得分:0)

MySQL doesn't support event, so it's not available through Knex.

Here is a list of supported DB's from the Knex docs: http://knexjs.org/#Builder-returning

This is the only other method that I'm aware of to get the last inserted row: How to get the ID of INSERTed row in mysql?

答案 3 :(得分:0)

这是我用的

knex(tableName).insert(data).then(row => {return row[0]});

答案 4 :(得分:0)

您可能还需要在此处发布insertObj,因为您已经设法创建了一个STATUS列,该列禁止null和default null。

对于其他对returning()感到疑惑的人:问题是,特定的功能“ returning”未在MySQL中实现-这是knex抱怨如果使用 returning()的原因。但是,如果您编写回调,knex本身可以返回插入行的ID。

knex.insert({
 name: 'Alice',
})
.into('person')
.then(function (id) {
  console.log(id) // [1001]
});

答案 5 :(得分:0)

这就是我的用法,(提示:请确保处理插入失败)

return knex(TABLE.CAPTCHA).insert({
    ...captcha,
    expire_time: createExpireTime()
}).then(ids => {
    return ids.length ? ids[0] : false;
});