我目前正在使用在我意识到 Rails 存在之前设计的数据库开发 Rails 应用程序。
我目前已经创建了一些迁移来向现有表添加一些新表和新列。
我想进行迁移以重新创建完整的数据库。
我应该遵循哪些步骤?
我应该手动创建所有迁移吗?
编辑:我对数据库模式感兴趣,而不是对数据库内容感兴趣
我目前正在使用在我意识到 Rails 存在之前设计的数据库开发 Rails 应用程序。
我目前已经创建了一些迁移来向现有表添加一些新表和新列。
我想进行迁移以重新创建完整的数据库。
我应该遵循哪些步骤?
我应该手动创建所有迁移吗?
编辑:我对数据库模式感兴趣,而不是对数据库内容感兴趣
当我们将 PHP 应用程序移植到 Rails 时,我们遇到了这个确切的问题。我们所做的与今天的建议类似。首先,我们将 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 列、外键关系、表名等。
请记住,如果使用外键约束和触发器,模式转储不支持它们。
我认为这将需要一些手动工作。
rake db:schema:dump
如果您的项目中没有该文件,您可以从运行开始db/schema.rb
。db/schema.rb
如果您一直在使用迁移,您可能已经有一个文件。该文件将包含您为开发配置的数据库的 ruby 表示形式。要获得另一个数据库的 ruby 表示,请将 RAILS_ENV 传递给 rake 命令(即RAILS_ENV=production rake db:schema:dump
)
然后,您可以使用该schema.rb
文件作为起点来创建重新创建预先存在的表的新迁移。创建新迁移文件时,请确保它的命名方式使其在其他迁移之前运行。
简短的回答:是的
长答案:这取决于数据库的设置方式以及与当前数据库的差异。另外,因为我假设 ID 是动态生成的 - 如果您从一个表移动到另一个表,请确保您的所有外键都已正确更新。
编写一个脚本,从旧数据重新创建整个数据库。如果您发布了您的数据库方案和您的新数据库方案,我很乐意为您提供进一步的帮助 :)