mysql Knex不返回插入ID

bvk5enib  于 2023-05-21  发布在  Mysql
关注(0)|答案(7)|浏览(139)

这是我的表(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。在我的情况下不会发生这种情况。我总是在插入时得到ID为0的值。
我试过添加一个额外的列,自动递增主键ID(删除CELL_ID作为PK)。在这种情况下,我得到了ID(自动递增值)。
我错过了什么?
谢谢

e4yzc0pl

e4yzc0pl1#

必须将第二个参数传递给insert方法,该方法指定从中检索值的列。
在您的情况下,它应该看起来像这样:

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

iaqfqrcu2#

MySQL不支持returning,因此不能通过Knex使用。
以下是Knex文档中支持的DB列表:http://knexjs.org/#Builder-returning
这是我所知道的获取最后插入行的唯一其他方法:How to get the ID of INSERTed row in mysql?

hjzp0vay

hjzp0vay3#

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

addCarMake: function(model, callback) {
    return 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]来进一步处理它。

f3temu5u

f3temu5u4#

这是我用的

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

qmelpv7a5#

您可能也需要在这里发布insertObj,因为您已经设法创建了一个禁止null和default null的列STATUS。
对于那些想返回()的人:问题是,MySQL中没有实现特定的“返回”功能-这就是为什么如果你使用returning(),knex会抱怨的原因。但是如果您编写回调函数,knex本身可以返回插入行的ID。

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

1bqhqjot6#

这就是我使用它的方式(tips:确保处理插入失败)

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

cnjp1d6j7#

与这里的其他答案没有什么不同,但显示了一个稍微简单和异步的方法:

const [id] = await db('Foo').insert(data)
const foo = await db('Foo').where({ id })
res.json(foo)

相关问题