2013-05-23 22 views
10

Sto usando Sequelize e sto cercando di ottenere l'ultimo ID inserito nella query non elaborata.Ottieni l'ultimo ID inserito Sequenza

La mia domanda è

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

La query viene fatto perfettamente, ma il risultato sulla manifestazione di successo è nulla.

Qualcuno può aiutare?

Grazie.


Ragazzi,

dopo alcune ricerche e tentativi un'infinità, ho capito quanto callee lavoro oggetto in sequelizeJs.

per favore, correggimi se la mia risposta è sbagliata.

l'oggetto callee ha bisogno di questa struttura

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

in questo caso "parameterName" è il campo che memorizzerà il nuovo ID, sequelize cerca __factory.autoIncrementField per impostare il valore dello scorso id inserita nella proprietà con la sua valore (valore di __factory.autoIncrementField).

così, la mia chiamata al metodo querys sarebbe

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

questo si tradurrà in oggetto come quello

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

grazie per tutto, e spero che questo possa aiutare qualcuno.

+0

Sei riuscito a farlo funzionare? Mi sono imbattuto nello stesso numero –

risposta

3

Sì, la risposta è funzionante. Un altro modo sarebbe

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

}) 
+0

Sono curioso, stai impostando 'raw: false', ma la tua query è una query non elaborata. Mi manca lo scopo della proprietà 'raw'? Potresti spiegare perché l'hai fatto? – Gavin

+1

fino ad ora mi ricordo, 'raw: true' non mapperà i risultati nel modello. – Kamrul

+1

Questo è molto utile sapere! Grazie – Gavin

5

È necessario aggiungere autoIncrement proprietà nella definizione del modello.

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

Quindi, è possibile accedere all'ultimo ID inserito con proprietà nella definizione del modello.

Article.create(article) 
    .then(result => console.log(result.id)); 
+0

Mi mancava questo.Pensavo che Sequelize considerasse automaticamente la chiave primaria come colonna di incremento automatico. Grazie. –