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?
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);
}
};
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.
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
etunique
propriétés
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
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)
(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'); } };
Faire un modifier le modèle Utilisateur.
- supprimer la table de la base de données.
- Annuler toutes les migrations:
sequelize db:migrate:undo:all
- Re-migrer vers les changements enregistrés dans la base de données.
sequelize db:migrate
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.