是否有Ruby数据库迁移gem,它可以帮助您将内容从旧结构移动到新结构?

是否有任何Ruby gems /库可以帮助您从旧的DB结构迁移到新的结构? ActiveRecord迁移可以很好地跟踪新的数据库结构,但我想知道是否有一些东西可以帮助您将整个遗留数据库迁移到新结构:

transfer_from(:source_table => 'person', :destination_table => 'dudes_and_dudets') do from :name, :to => :full_name from :dob, :to => :age do |dob| # this would, for example, load the result (Date.today - dob)/60/60/24/365 # of the block into :age end end 

(我意识到你可以像使用AR一样轻松地进行这些变换,但我希望魔术库可以有更多的变换。

伯恩斯

我已经开始研究这个了。

如果有人想提供有关更好/更具惯用性或更高效实施的提示,请告诉我们。

http://github.com/btelles/legacy_migrations

编辑

我现在已经在上面的github存储库中使用了这个确切的语法…计划添加一些rake任务,用于将旧结构映射到新的ActiveRecord类,以及更多变换……以防任何人感兴趣。

它也在gemcutter / ruby​​gems上:gem install legacy_migrations

您可以从迁移中访问所有模型,从而也可以处理所有数据迁移。 如果您已经知道这一点,并且您的问题是关于更简洁的方式,那么当然这不是您正在寻找的答案。

您的示例的一个问题是您无法迁移到早期版本,但仅限于您在转换中演示的阻止function。

我承认你的例子很好而且简洁,但这里有一个常规的迁移示例:

 class FooBar < ActiveRecord::Migration def self.up # This is only needed if the new table will have the same name. # Move the old one aside. rename_table :users, :old_users # The new table structure create_table :users do |t| t.string :full_name t.date :age end # Data migration OldUsers.all.each do |orig| User.create!( :full_name => orig.name, :age => (Date.today - orig.dob)/60/60/24/365 ) end # Clean up drop_table :old_users end def self.down # Exercise for the reader! end end # Temporary class for accessing the old table during conversion class OldUsers < ActiveRecord::Base; end 

我必须做一些你所描述的(我认为)的东西,并且我使用了Sequel 。 续集具有适应性和通用性,可以直接以相当方便的方式使用SQL,并且可以访问多种不同类型的数据库。

文档非常方便,我完全推荐它。

这是一个使用续集从geonames中获取一个巨大的任意flatfile并使用它来填充数据库并进行查询的示例 。 这可能是一个很好的例子,你可以做一些你想做的事情。

这是与轨道无关的。 不需要附加到模型,迁移或除了几个gem之外的任何其他东西。

有很多移动数据库没有转换。 我记得Rails嫉妒的家伙正在谈论一个gem(但它已经有一段时间了,我没有时间去挖掘)。 看看railsenvy.com?

看看Trucker Gem,它非常适合将遗留数据迁移到Rails应用程序中。 它为遗留数据库中的每个表创建活动记录对象,并将它们放入app / models / legacy中。 在这些类中,您可以定义它们如何映射到新类。

  1. 在config / database.yml中配置数据库
  2. rake db:schema:dump
  3. 将schema.rb转换为db / migrate / 001_create_database.rb
  4. 您可以生成其他迁移以维护数据库架构