web-dev-qa-db-fra.com

Comment autoIncrement fonctionne-t-il dans Sequelize de NodeJs?

Le document de Sequelize n'en dit pas beaucoup sur autoIncrement. Il ne comprend que l'exemple suivant:

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

Basé sur cet exemple, j'ai le code suivant:

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

Maintenant, quand je veux créer une entrée, je veux faire quelque chose comme ceci:

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

Cependant, lorsque j'exécute ce code, une erreur de base de données se produit: 

La valeur NULL dans la colonne "id" viole la contrainte non NULL

Je suppose que Sequelize mettrait le nombre entier pour moi ou définirait la table de base de données pour le faire lui-même. Apparemment non? Qu'est-ce qui me manque ici pour m'assurer que l'identifiant est automatiquement incrémenté et rempli?

Merci beaucoup.

32
Eric H.

normalement Sequelize.js s'adapte à la base de données. Donc, l'attribut autoincrement correspond à un type de série dans PostgreSQL.

J'ai déjà travaillé avec Sequelize et ce dont je me souviens, c'est qu'il n'est pas nécessaire de spécifier un identifiant comme clé primaire. Sequelize le fera pour vous.

Essayez de ne pas ajouter d'attribut id et voir si Sequelize ne l'ajoutera pas pour vous ou non.

21
Yacine Rezgui

L'option omitNull config est définie par défaut sur false. Définissez-le sur true, et la variable id sera prise en charge par 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]'})
9
mxgrn

Cela a fonctionné pour moi si j'ai ajouté manuellement le champ "id" (dans ce cas, Sequelize ne l'ajoutera pas automatiquement) dans le modèle comme ceci:

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

la commande SQL résultante est la suivante: "CREATE TABLE SI NON EXISTE" visiteur "(" id "SERIAL," email "varchar (255) ..."

0
AdelaF