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

j'ai un ensemble de Modèles Sequelize. Je veux utiliser les migrations, pas la synchronisation de DB.

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

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

36
demandé sur Michael Schmidt 2015-01-08 11:28:55

6 réponses

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

Ressources:

Si vous allez la manière classique, vous devez recréer les modèles via la CLI:

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

Il va générer ces fichiers:

modèles/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-créer mon utilisateur.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);
  }
};
23
répondu Dor Rotman 2015-02-10 17:02:43

vous pouvez maintenant utiliser le paquet npm sequelize-auto-migrations pour générer automatiquement un fichier migrations. https://www.npmjs.com/package/sequelize-auto-migrations

en utilisant sequelize-cli, initialisez votre projet avec

sequelize init

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

Installer sequelize-auto-migrations:

npm install sequelize-auto-migrations

créer un fichier de migration initial avec

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

Exécuter 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 la portée de la question.

6
répondu Kallaste 2018-03-25 03:02:56

j'ai créé un petit "générateur de fichiers de migration". Il crée des fichiers qui fonctionnent parfaitement bien en utilisant 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 différents modèles couvrant:

  • STRING, TEXT, ENUM, INTEGER, BOOLEAN, FLOAT as DataTypes

  • contraintes des clés étrangères (même réciproque (utilisateur belongsTo de l'équipe, l'équipe de belongsTo utilisateur en tant que titulaire))

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

5
répondu Manuel Bieh 2016-01-21 01:27:58

si vous ne voulez pas recréer votre modèle à partir de zéro, vous pouvez générer manuellement un fichier de migration en utilisant la commande CLI suivante:

sequelize migration:generate --name [name_of_your_migration]

cela générera un fichier de migration de squelette vierge. Bien qu'il ne copie pas la structure de votre modèle dans le fichier, je trouve que c'est plus facile et plus propre que de tout régénérer. Note: assurez-vous d'exécuter la commande à partir du répertoire contenant votre répertoire migrations; sinon, le CLI générera un nouveau la migration dir pour vous

5
répondu john_mc 2017-12-13 23:16:49

bien qu'il ne génère pas automatiquement, une façon de générer de nouvelles migrations sur un changement de modèle est: (en supposant que vous utilisez la structure du fichier stock sequelize-cli où les migrations, et les modèles sont au même niveau)

  1. (identique à la suggestion de Manuel Bieh, mais en utilisant un require au lieu d'un import) 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. Faire un modifier le 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-migrer vers les changements enregistrés dans la base de données. sequelize db:migrate
3
répondu T Ratnayake 2016-12-04 12:28:22

j'ai récemment essayé l'approche suivante qui semble bien fonctionner, même si Je ne suis pas sûr à 100% s'il pourrait 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 en utilisant 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 (au moins semble) fonctionnent comme prévu. Même toutes les associations sont là si elles sont définies correctement.

1
répondu Manuel Bieh 2016-01-13 13:37:09