Comment fonctionne l'auto-injection dans le Sequelize de NodeJs?

le document de Sequelize ne dit pas grand-chose à propos de autoIncrement. Il comprend uniquement 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 que je veux faire quelque chose comme ceci:

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

Cependant, lorsque j'execute ce code j'obtiens une erreur de base de données:

valeur Null dans la colonne "id" viole la contrainte not null

je supposons 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 pas? Qu'est-ce que je manque ici pour m'assurer que la pièce d'identité est incrémentée et remplie automatiquement?

Merci beaucoup.

31
demandé sur Eric H. 2013-04-01 09:12:56

3 réponses

normalement Sequelize.js s'adapte avec la base de données. Ainsi, 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 que vous n'avez pas besoin de spécifier un id comme clé primaire. Sequelize le fera pour vous.

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

17
répondu Yacine Rezgui 2013-04-01 11:52:39

omitNull option de configuration par défaut est false. Attribuez la valeur true, et le id sera pris 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: 'foo@bar.com'})
9
répondu mxgrn 2013-08-30 06:17:24

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 result SQL est: "CREATE TABLE IF NOT EXISTS "visitor" ("id" SERIAL, "email" varchar (255)..."

0
répondu AdelaF 2017-10-31 14:22:53