2013-04-01 15 views
29

Il documento di Sequelize non dice molto su autoIncrement. Esso include solo il seguente esempio:Come funziona autoIncrement in Sequelize di NodeJs?

// autoIncrement can be used to create auto_incrementing integer columns 
incrementMe: { type: Sequelize.INTEGER, autoIncrement: true } 

base al largo di questo esempio ho il seguente codice:

db.define('Entries', { 
    id: { 
     type: Seq.INTEGER, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    title: { 
     type: Seq.STRING, 
     allowNull: false 
    }, 
    entry: { 
     type: Seq.TEXT, 
     allowNull: false 
    } 
} 

Ora, quando voglio creare una voce che voglio fare qualcosa di simile:

models.Entry.create({title:'first entry', entry:'yada yada yada'}) 

Tuttavia, quando eseguo il codice che ottengo un errore di database:

Null value in column "id" violates not null constraint

Suppongo che Sequelize inserisca il numero intero per me o definisca la tabella del database per farlo da solo. Apparentemente no? Cosa mi manca qui per assicurarmi che l'ID venga automaticamente incrementato e riempito?

Grazie mille.

risposta

14

normalmente Sequelize.js si adatta con il databse. Quindi l'attributo autoincrement corrisponde a un tipo seriale in PostgreSQL.

Ho già lavorato con Sequelize e quello che ricordo è che non è necessario specificare un id come chiave primaria. Sequelize lo farà per te.

Prova a non aggiungere un attributo id e vedere se Sequelize non lo aggiungerà per te o meno.

+0

dispiace spostato le priorità del progetto, ma tornerò da te questo fine settimana su questo: –

+1

questo è giusto per i miei scopi, ma continuo a chiedermi qual è lo scopo dell '"autoIncrement" se devi inserirlo ogni volta. Forse ho configurato male. –

+0

il problema è come fornire nomi personalizzati di chiavi primarie! –

8

omitNull l'opzione di configurazione di default è false. Impostare a true, e la id saranno presi cura di Postgres:

sequelize = new Sequelize('mydb', 'postgres', null, { 
    host: 'localhost', 
    port: 5432, 
    dialect: 'postgres', 
    omitNull: true 
}) 

Visitor = sequelize.define('visitor', { 
    email: Sequelize.STRING 
}) 

Visitor.create({email: '[email protected]'}) 
+5

Come per [questo problema segnalato] (https://github.com/sequelize/sequelize/issues/2813), 'omitNull' non dovrebbe più essere utilizzato. Usa 'autoIncrement: true' invece nella colonna corrispondente alla definizione del modello e semplicemente non fornisci un valore quando fai' create() '. –

+0

@ThalisK. : Questo non funziona per me. Hanno lo stesso problema dell'autore. – akohout

+0

@mxgrn, grazie al suo lavoro per me, se non si omette il valore null, postgresql metterà valore null all'interno dell'istruzione. https://github.com/sequelize/sequelize/issues/925 –

0

Ha funzionato per me, se ho aggiunto manualy il campo "id" (in questo caso Sequelize Non aggiungerlo automaticamente) nel modello in questo modo: comando

Visitor = sequelize.define('visitor', { 
    id: { 
     type: Sequelize.INTEGER, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    email: Sequelize.STRING 
}) 

risultato SQL è: "CREATE TABLE IF NOT EXISTS "visitatore"(" id "SERIAL, "email" varchar (255) ..."

Problemi correlati