11

是否有任何 Ruby gems/libraries 可以帮助您从旧的数据库结构迁移到新的结构?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 一样轻松地进行这些转换,但我希望魔法库会有更多的转换。

伯恩斯

4

6 回答 6

3

我已经开始着手这方面的工作了。

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

http://github.com/btelles/legacy_migrations

编辑

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

它也在 gemcutter/rubygems 上: gem install legacy_migrations

于 2010-02-24T13:47:28.413 回答
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
于 2010-02-19T19:22:25.023 回答
1

我不得不做类似(我认为)你所描述的事情,并且我使用了Sequel。Sequel 适应性强且通常有用,可以以相当方便的方式直接使用 SQL,并且可以访问多种不同类型的 DB。

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

这是一个使用 sequel 从geonames中获取一个巨大的任意平面文件并使用它来填写数据库并进行查询的示例。这可能是一个很好的例子,可以让你做一些你想做的事情。

它与 Rails 无关。不需要附加到模型、迁移或除了几个 gem 之外的任何其他东西。

于 2010-02-21T23:55:54.733 回答
0

有很多无需转换即可移动数据库。我记得 Rails Envy 的人在谈论宝石(但那是一段时间前的事了,我还没有时间去挖掘)。看看 railsenvy.com 吗?

于 2010-02-19T17:19:31.657 回答
0

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

于 2011-02-24T09:51:08.137 回答
-1
  1. 在 config/database.yml 中配置你的数据库
  2. rake db:schema:dump
  3. 将 schema.rb 转换为 db/migrate/001_create_database.rb
  4. 您可以生成其他迁移来维护您的数据库架构
于 2010-02-16T05:01:20.220 回答