2012-04-28 17 views
22

¿Cómo se realizan las migraciones de la base de datos con Meteor? Con Ruby on Rails, hay ActiveRecord :: Migration. ¿Hay un mecanismo equivalente en Meteor?Meteor cómo realizar migraciones de bases de datos?

Por ejemplo, hago una aplicación con algunos datos de usuario. Estoy almacenando los datos en Mongo usando un formato JSON. La aplicación cambia y el esquema de la base de datos JSON debe cambiar. Puedo escribir un método de migración para cambiar el esquema, sin embargo, solo quiero que esto se ejecute si la base de datos del servidor está desactualizada.

Respuesta

35

No hay nada integrado en esto. Lo que hice por mí mismo ahora es similar a cómo funciona Rails, pero como parte del inicio en lugar de una tarea separada. Primero cree un Meteor.Collection llamado Migrations, y luego para cada migración discreta, cree una función bajo el subdirectorio server que se ejecuta al inicio. Solo debe ejecutar la migración si no se ejecutó antes, y debe marcar la migración en la colección Migrations una vez que se haya completado.

// database migrations 
Migrations = new Meteor.Collection('migrations'); 

Meteor.startup(function() { 
    if (!Migrations.findOne({name: "addFullName"})) { 
    Users.find().forEach(function (user) { 
     Users.update(user._id, {$set: {fullname: users.firstname + ' ' + users.lastname}}); 
    }); 
    Migrations.insert({name: "addFullName"}); 
    } 
}); 

Usted podría extender esta técnica para apoyar abajo migraciones (buscar la existencia de una migración dado y revertirla), hacer cumplir una orden de clasificación de las migraciones, y dividir cada migración en un archivo separado si querías.

Sería interesante pensar en un paquete inteligente para automatizar esto.

+0

Eventualmente podría obtener la motivación para hacer un paquete inteligente con esta lógica. Esto es mejor que un método oscuro de Meteor. – wizonesolutions

+0

Si tiene más de un servidor ejecutándose en la misma base de datos (múltiples servidores web o micro-servicios), puede tener problemas cuando 5 servidores ejecutan la misma consulta. Este paquete parece usar un [mecanismo de bloqueo] (https://github.com/percolatestudio/meteor-migrations/blob/master/migrations_server.js#L159) –

4

Creé un paquete inteligente para este caso de uso.
Ver https://atmosphere.meteor.com/package/migrations

+5

También hay https://github.com/percolatestudio/meteor- migraciones que me parece que tienen un diseño más limpio que https://github.com/rantav/meteor-migrations. –

5

Como Aram ya se ha señalado en el comentario, p ercolate:migrations paquete le ofrece lo que necesita. Muestra

Migrations.add({ 
    version: 1, 
    name: 'Adds pants to some people in the db.', 
    up: function() {//code to migrate up to version 1} 
    down: function() {//code to migrate down to version 0} 
}); 

Migrations.add({ 
    version: 2, 
    name: 'Adds a hat to all people in the db who are wearing pants.', 
    up: function() {//code to migrate up to version 2} 
    down: function() {//code to migrate down to version 1} 
}); 
Cuestiones relacionadas