Meteor 如何执行数据库迁移?

Posted

技术标签:

【中文标题】Meteor 如何执行数据库迁移?【英文标题】:Meteor how to perform database migrations? 【发布时间】:2012-05-09 01:53:57 【问题描述】:

如何使用 Meteor 执行数据库迁移?有了 Ruby on Rails,就有了 ActiveRecord::Migration。 Meteor 中是否有等效机制?

例如,我用一些用户数据制作了一个应用程序。我使用 JSON 格式将数据存储在 Mongo 中。应用程序发生更改,JSON 数据库架构也需要更改。我可以编写一个迁移方法来更改架构,但是,我只希望在服务器数据库过时时运行它。

【问题讨论】:

【参考方案1】:

没有为此内置任何内容。我自己现在所做的与 Rails 的工作方式类似,但作为启动的一部分而不是单独的任务。首先创建一个名为 Migrations 的Meteor.Collection,然后为每个离散的迁移,在启动时运行的server 子目录下创建一个函数。它应该只在之前没有运行过迁移的情况下运行迁移,并且一旦迁移完成,它应该在 Migrations 集合中标记迁移。

// 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");
  
);

您可以扩展此技术以支持向下迁移(查找给定迁移的存在并将其反转),对迁移强制执行排序顺序,并根据需要将每个迁移拆分为单独的文件。

考虑一个自动化的智能包会很有趣。

【讨论】:

我最终可能会获得使用这种逻辑制作智能包的动力。这仍然比晦涩难懂的 Meteor 方法好。 如果您在同一个数据库上运行多台服务器(多个 Web 服务器或微服务),当 5 台服务器都运行相同的查询时,您可能会遇到麻烦。这个包似乎使用了locking mechanism【参考方案2】:

正如 Aram 在评论中已经指出的那样,percolate:migrations 包可以满足您的需求。样本

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
);

【讨论】:

【参考方案3】:

我为此用例创建了一个智能包。 见https://atmosphere.meteor.com/package/migrations

【讨论】:

还有github.com/percolatestudio/meteor-migrations,在我看来它的设计比github.com/rantav/meteor-migrations 更简洁。

以上是关于Meteor 如何执行数据库迁移?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 空间数据 如何实现 迁移?

使用 Docker-Compose 时如何执行 Django 数据库迁移?

如何在wordpress中进行数据库迁移?

如何在 django 迁移中执行原始 SQL

数据迁移服务 (DMS):出现错误后如何继续(无法执行删除语句)?

Laravel中如何做数据库迁移