如何为旧数据库创建迁移?

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

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

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

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

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

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

然后,您可以使用该schema.rb文件作为创建重新创建预先存在的表的新迁移的起点。 创建新的迁移文件时,请确保以其在其他迁移之前运行的方式命名。

当我们将PHP应用程序移植到rails时,我们遇到了这个问题。 我们所做的与tomtoday的建议类似。 首先,我们将rails配置指向当前数据库。 然后我们做了一个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列,外键关系,表名等。
请记住,如果使用模式转储,则模式转储不支持外键约束和触发器。

简短回答:是的

答案很长:这取决于数据库的设置方式以及它与当前数据库的差异程度。 此外,因为我假设ID是动态生成的 – 如果从一个表移动到另一个表,请确保所有外键都正确更新。

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