web-dev-qa-db-fra.com

Comment ajouter une colonne dans le modèle existant Sequelize?

J'ai ajouté un modèle et un fichier de migration à l'aide de cette commande

node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

Maintenant, je voulais ajouter quelques champs supplémentaires comme le sexe et l'âge dans le tableau existant (modèle). J'ai changé de modèle manuellement et lance cette commande

node_modules/.bin/sequelize db:migrate

Mais il répond que "Aucune migration n'a été exécutée, le schéma de base de données était déjà à jour".

User.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    email: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};

Merci d'avance :)

3
Ajay Poriya

La réponse de Suvethan est correcte, mais le fragment de code de migration contient un bogue mineur. Les migrations successives attendent une promesse, qui est notée dans un commentaire dans le squelette de migration généré:

Add altering commands here.
Return a promise to correctly handle asynchronicity.

Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });

Ainsi, le retour d'un éventail de promesses peut potentiellement conduire à des résultats inattendus car rien ne garantit que toutes les promesses auront été résolues avant de passer à la prochaine migration. Pour la plupart des opérations, il est peu probable que vous rencontriez des problèmes, car la plupart des tâches se termineront avant la fin du processus par Sequelize. Mais je pense qu'il vaut mieux prévenir que guérir quand il s'agit de migrer une base de données. Vous pouvez toujours tirer parti de la gamme de promesses. vous avez juste besoin de l'envelopper dans un appel Promise.all.

Exemple de Suvethan, mais avec Promise.all:

module.exports = {
  up: function (queryInterface, Sequelize) {
    return Promise.all([
      queryInterface.addColumn(
        'Users',
        'gender',
         Sequelize.STRING
       ),
      queryInterface.addColumn(
        'Users',
        'age',
        Sequelize.STRING
      )
    ]);
  },

  down: function (queryInterface, Sequelize) {
    // logic for reverting the changes
  }
};
1
David Blanchard

Afin d'ajouter de nouveaux champs à la table, nous devrions utiliser le squelette de migration comme indiqué ci-dessous.

sequelize migration:create --name Users

Ouvrez le fichier de migration et ajoutez les codes ci-dessous.

module.exports = {
  up: function (queryInterface, Sequelize) {
    return [ queryInterface.addColumn(
              'Users',
              'gender',
               Sequelize.STRING
             ),
            queryInterface.addColumn(
             'Users',
             'age',
             Sequelize.STRING
          )];
  },

  down: function (queryInterface, Sequelize) {
    // logic for reverting the changes
  }
};

Ensuite, lancez la migration

node_modules/.bin/sequelize db:migrate

Note : l'objet queryInterface passé peut être utilisé pour modifier la base de données. L'objet Sequelize stocke les types de données disponibles tels que STRING ou INTEGER. 

Liste complète des méthodes dans l'interface de requête

J'espère que cela t'aidera. Si vous avez des problèmes, faites le moi savoir.

4
Suvethan Nantha