【发布时间】:2011-10-12 00:56:25
【问题描述】:
我正在创建一个新的 Rails 3.1 应用程序。 我希望这个新应用程序能够重用现有数据库(由以前的 rails 2 应用程序创建)。
我创建了新的应用程序定义模型,该模型重用了数据库中的一些现有数据。
在开发和测试阶段一切正常,因为它在干净的表数据库上运行,但在尝试部署到生产时,我收到如下消息:
PGError: ERROR: column "email" of relation "users" already exists
*** [err :: localhost] : ALTER TABLE "users" ADD COLUMN "email" character varying(255) DEFAULT '' NOT NULL
但是我在迁移中的想法是这样的
class DeviseCreateUsers < ActiveRecord::Migration
def change
change_table(:users) do |t|
t.database_authenticatable :null => false
t.recoverable
t.rememberable
t.trackable
t.timestamps
end
end
如何让 db:migrate 忽略已经存在的内容,只更改新事物和/或新类型?
我在 stackoverflow 上看到了类似的问题,但没有人回答这个问题。感谢您的回答。
【问题讨论】:
-
我建议你创建一组迁移来复制现有的生产数据库,这些迁移应该放在迁移列表的开头,这个子集中的最后一个迁移应该有当前生产模式版本的编号(参见@生产数据库上的 987654323@)。应该修复所有以后的迁移。
-
感谢您的提示,这里的问题是,例如,
t.recoverable会添加我不明确知道的字段。因此需要告诉 rails “只添加缺少的内容”。 -
您可以检查文件 db/schema.rb 以了解架构(在开发和生产中)。
-
确实可以。然而,这意味着答案是:“没有轨道不会处理这个,你应该手动做”。感谢您的建议。
-
Rails 会处理这个问题,在一种情况下您不需要做很多事情:您将所有迁移从旧项目复制到新项目。尝试通过重用数据库版本来保持数据库一致性。每个数据库迁移文件都有UTC时间戳作为名称,名称是数据库版本
标签: ruby-on-rails ruby database postgresql rails-migrations