2013-04-01 14 views
29

Sequelize's Dokument sagt nicht viel über autoIncrement. Es enthält nur das folgende Beispiel:Wie funktioniert autoIncrement in Sequelize von NodeJs?

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

Basiert weg von diesem Beispiel habe ich den folgenden Code haben:

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

Nun, wenn ich möchte einen Eintrag ich so etwas wie dies tun wollen erstellen:

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

Allerdings, wenn ich diesen Code ausführen bekomme ich einen Datenbankfehler:

Null value in column "id" violates not null constraint

Ich würde annehmen, Sequelize würde die ganze Zahl für mich oder definieren Sie die Datenbanktabelle, um das selbst zu tun. Scheinbar nicht? Was fehlt mir hier um sicherzustellen, dass die ID automatisch inkrementiert und gefüllt wird?

Vielen Dank.

Antwort

14

normalerweise Sequelize.js passen sich mit der Datenbank an. Das Autoincrement-Attribut entspricht also einem seriellen Typ in PostgreSQL.

Ich arbeitete bereits mit Sequelize und was ich erinnere ist, dass Sie keine ID als Primärschlüssel angeben müssen. Sequelize wird es für Sie tun.

Versuchen Sie, kein ID-Attribut hinzuzufügen und sehen Sie, ob Sequelize es nicht für Sie hinzufügen wird oder nicht.

+0

leider Projekt Prioritäten verschoben, aber Ich werde dieses Wochenende auf Sie zurückkommen. –

+1

das ist richtig für meine Zwecke, aber immer noch wundernd Was ist der Sinn des 'autoIncrement', wenn Sie es jedes Mal eingeben müssen? Vielleicht habe ich falsch konfiguriert. –

+0

Das Problem ist, wie benutzerdefinierte Primärschlüssel Namen geben! –

8

omitNull Konfig Option ist standardmäßig falsch. Setzen Sie ihn auf true, und die id wird von Postgres betreut werden:

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

Gemäß [diesem gemeldeten Problem] (https://github.com/sequelize/sequelize/issues/2813) sollte 'omitNull' nicht mehr verwendet werden. Verwenden Sie 'autoIncrement: true' stattdessen in der entsprechenden Spalte der Modelldefinition und geben Sie einfach keinen Wert ein, wenn Sie' create() 'ausführen. –

+0

@ThalisK. : Das funktioniert nicht für mich. Habe das selbe Problem wie der Autor. – akohout

+0

@mxgrn, danke, es funktioniert für mich, wenn Sie null Wert nicht weglassen, wird postgresql null Wert in Anweisung setzen. https://github.com/sequelize/sequelize/issues/925 –

0

Es funktionierte für mich, wenn ich manualy die „id“ Feld hinzugefügt (in diesem Fall Sequelize wird es nicht automatisch hinzufügen) im Modell dies wie:

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

Ergebnis SQL-Befehl lautet: "CREATE TABLE IF NOT EXISTS "Besucher"(" id "SERIAL "E-Mail" varchar (255) ..."

Verwandte Themen