web-dev-qa-db-fra.com

Comment générer automatiquement des migrations avec Sequelize CLI à partir de modèles Sequelize?

J'ai un ensemble de modèles Sequelize. Je veux utiliser les migrations, pas DB Sync.

Sequelize CLI semble être capable de le faire, selon cet article : "Lorsque vous utilisez le CLI pour la génération du modèle, vous obtenez également les scripts de migration gratuitement . "

Comment générer automatiquement les migrations avec Sequelize CLI à partir de modèles Sequelize existants?

48
Michael Schmidt

Vous ne pouvez pas créer de scripts de migration pour les modèles existants.

Ressources:

Si vous suivez la méthode classique, vous devrez recréer les modèles via l'interface de ligne de commande:

sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text

Il va générer ces fichiers:

models/myuser.js:

"use strict";
module.exports = function(sequelize, DataTypes) {
  var MyUser = sequelize.define("MyUser", {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    bio: DataTypes.TEXT
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return MyUser;
};

migrations/20150210104840-create-my-user.js:

"use strict";
module.exports = {
  up: function(migration, DataTypes, done) {
    migration.createTable("MyUsers", {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
      },
      first_name: {
        type: DataTypes.STRING
      },
      last_name: {
        type: DataTypes.STRING
      },
      bio: {
        type: DataTypes.TEXT
      },
      createdAt: {
        allowNull: false,
        type: DataTypes.DATE
      },
      updatedAt: {
        allowNull: false,
        type: DataTypes.DATE
      }
    }).done(done);
  },
  down: function(migration, DataTypes, done) {
    migration.dropTable("MyUsers").done(done);
  }
};
27
Dor Rotman

Si vous ne souhaitez pas recréer votre modèle à partir de rien, vous pouvez générer manuellement un fichier de migration à l'aide de la commande CLI suivante:

sequelize migration:generate --name [name_of_your_migration]

Cela générera un fichier de migration squelette vide. Bien que la structure de votre modèle ne soit pas copiée dans le fichier, je la trouve plus simple et plus propre que de tout régénérer. Remarque: veillez à exécuter la commande à partir du répertoire contenant de votre répertoire de migration. sinon, la CLI générera un nouveau répertoire de migration pour vous

21
john_mc

Vous pouvez maintenant utiliser le package npm séquençage-auto-migrations pour générer automatiquement un fichier de migration. https://www.npmjs.com/package/sequelize-auto-migrations

Avec sequelize-cli, initialisez votre projet avec

sequelize init

Créez vos modèles et mettez-les dans votre dossier de modèles.

Installez les migrations sequelize-auto:

npm install sequelize-auto-migrations

Créez un fichier de migration initial avec

node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>

Exécutez votre migration:

node ./node_modules/sequelize-auto-migrations/bin/runmigration

Vous pouvez également générer automatiquement vos modèles à partir d'une base de données existante, mais cela dépasse le cadre de la question.

17
Kallaste

J'ai créé un petit "générateur de fichier de migration" de travail. Il crée des fichiers qui fonctionnent parfaitement avec sequelize db:migrate - même avec des clés étrangères!

Vous pouvez le trouver ici: https://Gist.github.com/manuelbieh/ae3b028286db10770c81

Je l'ai testé dans une application avec 12 modèles différents couvrant:

  • STRING, TEXT, ENUM, INTEGER, BOOLEAN, FLOAT en tant que DataTypes

  • Contraintes de clé étrangère (même réciproques (l'utilisateur appartient à l'équipe, l'équipe appartient à l'utilisateur en tant que propriétaire))

  • Index avec les propriétés name, method et unique

5
Manuel Bieh

Bien qu'il ne génère pas automatiquement, une façon de générer de nouvelles migrations lors d'une modification d'un modèle est la suivante: (en supposant que vous utilisiez la structure de fichier stock sequelize-cli où les migrations et les modèles se trouvaient au même niveau)

  1. (Identique à la suggestion de Manuel Bieh, mais en utilisant une require plutôt qu'une importation) Dans votre fichier de migration (si vous n'en avez pas, vous pouvez en générer un en faisant "sequelize migration:create ") ont le code suivant:

    'use strict';
    var models = require("../models/index.js")
    module.exports = {
      up: function(queryInterface, Sequelize) {
        return queryInterface.createTable(models.User.tableName, 
          models.User.attributes);
      },
      down: function(queryInterface, Sequelize) {
        return queryInterface.dropTable('Users');
      }
    };
    
  2. Apportez une modification au modèle utilisateur.

  3. Supprimer la table de la base de données.
  4. Annuler toutes les migrations: sequelize db:migrate:undo:all
  5. Re-migrez pour que les modifications soient enregistrées dans la base de données. sequelize db:migrate
4
T Ratnayake

J'ai récemment essayé l'approche suivante, qui semble bien fonctionner, même si je ne suis pas sûr à 100% s'il peut y avoir des effets secondaires:

'use strict';

import * as models from "../../models";

module.exports = {

  up: function (queryInterface, Sequelize) {

    return queryInterface.createTable(models.Role.tableName, models.Role.attributes)
    .then(() => queryInterface.createTable(models.Team.tableName, models.Team.attributes))
    .then(() => queryInterface.createTable(models.User.tableName, models.User.attributes))

  },

  down: function (queryInterface, Sequelize) {
    ...
  }

};

Lors de l'exécution de la migration ci-dessus, utilisez sequelize db:migrate, ma console dit:

Starting 'db:migrate'...
Finished 'db:migrate' after 91 ms
== 20160113121833-create-tables: migrating =======
== 20160113121833-create-tables: migrated (0.518s)

Toutes les tables sont là, tout fonctionne (du moins semble-t-il) comme prévu. Même toutes les associations sont présentes si elles sont définies correctement.

0
Manuel Bieh