21

我正在使用 Sequelize,并且试图在原始查询中获取最后插入的 ID。

我的查询是

.query(Sequelize.Utils.format(["insert into MyTable (field1, field2) values (?,?)", val1, val2])

查询已完美完成,但成功事件的结果为null

有人可以帮忙吗?

谢谢。


经过一些研究和无数次尝试,我了解了被调用对象在 sequelizeJs 中是如何工作的。

请纠正我,如果我的答案是错误的。

被调用对象需要这个结构

{__factory:{autoIncrementField: 'parameterName'}, parameterName: '' }

在这种情况下,“parameterName”是将存储新 ID 的字段,sequelize 查找 __factory.autoIncrementField 以将最后插入的 id 的值设置为属性及其值(__factory.autoIncrementField 的值)。

所以,我对查询方法的调用是

.query(sequelize.Utils.format(tempInsert), {__factory:{autoIncrementField: 'parameterName'}, parameterName: '' }, {raw: true})

这将导致这样的对象

{ __factory: { autoIncrementField: 'parameterName' }, parameterName: newInserted_ID }

谢谢大家,我希望这可以帮助别人。

4

2 回答 2

24

您必须在模型定义中添加autoIncrement 属性。

const Article = sequelize.define('articles', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  }, {},
  {
   createdAt: false,
   updatedAt: false
  });

然后,您可以使用模型定义中的属性访问最后插入的 id。

Article.create(article)
  .then(result => console.log(result.id));
于 2017-06-20T07:43:08.970 回答
6

是的,你的答案是有效的。另一种方法是

var Sequelize = require("sequelize")
var sequelize = new Sequelize('test', 'root', 'root', {dialect: 'mysql'})

var Page = sequelize.define( 'page', {
  type  : {type: Sequelize.STRING(20)},
  order : {type: Sequelize.INTEGER, defaultValue: 1}
},{
  timestamps: false,
  underscored: true
})

Page.__factory = {autoIncrementField: 'id'}
Page.id = ''

sequelize.query('INSERT INTO pages SET `type` = ?, `order` = ?, `topic_version_id` = ?', Page, {raw: false}, ['TEXT', 1, 1] ).success(function(page) {
  console.log(page)
  Page.find(page.id)
    .success(function(result){
      console.log(result)
    })

})
于 2013-09-25T05:05:24.477 回答