web-dev-qa-db-ja.com

最後に挿入されたIDを取得します

Sequelizeを使用していて、生のクエリで最後に挿入されたIDを取得しようとしています。

私の質問は

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

クエリは完全に実行されますが、成功イベントの結果はnullです。

誰かが助けることができますか?

ありがとう。


みんな、

いくつかの調査と無数の試みの後、私はcalleeオブジェクトがsequelizeJsでどのように機能するかを理解しました。

私の答えが間違っている場合は、私を訂正してください。

呼び出し先オブジェクトにはこの構造が必要です

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

この場合、「parameterName」は新しいIDを格納するフィールドであり、sequelizeは__factory.autoIncrementFieldを探して、最後に挿入されたIDの値をその値(__factory.autoIncrementFieldの値)とともにプロパティに設定します。

したがって、querysメソッドの呼び出しは次のようになります。

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

これにより、そのようなオブジェクトが作成されます

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

すべてに感謝します、そして私はこれが誰かを助けることができることを願っています。

15
ops.rio

はい、あなたの答えは機能しています。別の方法は

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

})
5
Kamrul

モデル定義に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));
17
MiraGe