2013-04-01 13 views
29

Dokument Sequelize nie mówi wiele o autoIncrement. Obejmuje on tylko następujący przykład:Jak działa autoIncrement w Sequelize NodeJs?

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

Opierając się na tym przykładzie mam następujący kod:

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

Teraz, gdy chcę utworzyć wpis Chcę zrobić coś takiego:

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

jednak, kiedy wykonać ten kod pojawia się błąd bazy danych:

Null value in column "id" violates not null constraint

Założę się, że Sequelize wstawiłaby dla mnie liczbę całkowitą lub zdefiniowałaby tabelę bazy danych, aby to zrobić. Najwyraźniej nie? Czego mi tu brakuje, aby upewnić się, że identyfikator jest automatycznie zwiększany i wypełniany?

Wielkie dzięki.

Odpowiedz

14

Normalnie Sequelize.js dostosowuje się do databse. Tak więc atrybut autoincrement odpowiada typowi szeregowemu w PostgreSQL.

Pracowałem już z programem Sequelize i pamiętam, że nie trzeba określać identyfikatora jako klucza podstawowego. Sequelize zrobi to za Ciebie.

Staraj się nie dodawać atrybutu id i sprawdzać, czy Sequelize nie doda go za ciebie, czy nie.

+0

przykro przesunięty priorytetów projektów, ale Wrócę do ciebie w ten weekend na ten temat –

+1

to jest właściwe dla moich celów, ale wciąż zastanawiam się jaki jest cel "autoInkrementacji", jeśli musisz go wprowadzać za każdym razem. Być może źle skonfigurowałem. –

+0

Problem polega na tym, w jaki sposób nadać niestandardowe nazwy kluczy! –

8

omitNull Opcja konfiguracji domyślnie to false. Ustawić go na true, a id zostanie załatwione przez PostgreSQL:

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

Zgodnie z [tym zgłoszonym problemem] (https://github.com/sequelize/sequelize/issues/2813) nie należy już używać opcji "omitNull". Użyj 'autoIncrement: true' zamiast tego w odpowiedniej kolumnie przy definicji modelu i po prostu nie podawaj wartości, gdy robisz' create() '. –

+0

@ ThalisK. : To nie działa dla mnie. Mają ten sam problem co autor. – akohout

+0

@mxgrn, dziękuje za swoje prace dla mnie, jeśli nie anulujesz wartości pustej, postgresql umieści pustą wartość wewnątrz instrukcji. https://github.com/sequelize/sequelize/issues/925 –

0

on pracował dla mnie, gdybym dodał manualy „ID” pole (w tym przypadku Sequelize nie doda go automatycznie) w modelu tak: komenda SQL

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

wynik to: "CREATE TABLE IF NOT EXISTS "gość"(" id "serial "email" varchar (255) ..."