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

时间:2010-02-16 04:45:48

标签: ruby-on-rails ruby database activerecord data-migration

是否有任何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一样轻松地进行这些变换,但是我希望魔术库可以有更多的变换。

Berns的

6 个答案:

答案 0 :(得分:3)

我已经开始研究这个了。

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

http://github.com/btelles/legacy_migrations

修改

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

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

答案 1 :(得分:2)

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

您的示例存在的一个问题是,您无法迁移到早期版本,只是因为您在转化过程中展示了阻止功能。

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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