2008-10-10 40 views
1

我目前正在使用在我意识到Rails存在之前设计的数据库开发Rails应用程序。
我目前已经创建了一些迁移功能,为现有表添加一些新表和新列。如何为遗留数据库创建迁移?

我想迁移到重新创建完整的数据库。

我应该遵循哪些步骤?
我应该手动创建所有的迁移吗?

编辑:我感兴趣的数据库模式不是在数据库内容

回答

3

我认为这将需要一些手动工作。

如果您的项目中没有文件db/schema.rb,则可以通过运行rake db:schema:dump开始。如果您一直在使用迁移,那么您可能已经拥有db/schema.rb文件。该文件将包含您为开发配置的数据库的ruby表示。要获得RAILS_ENV中另一个数据库传递到rake命令的红宝石表示(例如,RAILS_ENV=production rake db:schema:dump

然后,您可以使用该文件作为创建新迁移来重新创建已存在的表。在创建新的迁移文件时,请确保它的命名方式使得它将在其他迁移之前运行。

+0

嗨,我有类似的问题,你是什么意思,使用schema.rb作为'rake db:schema:dump`后面的起点 – hershey92 2012-07-03 17:03:14

+0

拿出转储并创建一个(单一)迁移出来(基本上包裹整个在rails移植语句中的东西)。 – 2012-12-31 14:28:57

1

简短的回答:是的

龙答:这取决于数据库是如何建立和多远它不同于当前的一个。另外,因为我假定ID是动态生成的 - 如果您从一个表移动到另一个表,请确保所有外键都已正确更新。

编写一个脚本,用于从旧数据重新创建整个数据库。如果您发布了您的数据库方案和您的新数据库计划,我很乐意帮助您进一步:)

+0

数据库方案将是相同的。我只写了几个新表的迁移。是否必须为每个旧表格编写迁移? – hectorsq 2008-10-10 05:05:45

7

当我们将一个PHP应用程序移植到rails时,我们遇到了这个问题。我们所做的与tomtoday的建议类似。首先,我们将轨道配置指向当前数据库。然后我们做了rake db:schema:dump并将db/schema.rb文件复制到db/schema_base.rb之类的东西上。然后,您将进行第一次迁移,即加载该模式。例如:

class CreateTables < ActiveRecord::Migration 
    def self.up 
    `cp #{Rails.root}/db/schema_base.rb #{Rails.root}/db/schema.rb` 
    Rake::Task['db:schema:load'].invoke 
    end 

    def self.down 
    end 
end 

只是强制这是第一次迁移,你会在你的路上。然后,您开始编写迁移以将数据库转换为更符合Rails方式。我们编写了迁移以正确重命名id列,外键关系,表名等。
请记住,如果您使用这些模式转储,则不支持外键约束和触发器。