Rails通过现有数据库进行迁移

时间:2011-07-24 13:51:56

标签: ruby-on-rails ruby database postgresql rails-migrations

我正在创建一个新的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上看到了类似的问题,但没有人回答这个问题。谢谢你的回答。

2 个答案:

答案 0 :(得分:10)

如果您使用的是现有数据库,则不应尝试通过迁移覆盖它,您应该在schema.rb中复制现有数据库,然后从那里向前迁移,只添加已更改的字段。

答案 1 :(得分:1)

我采取的一种方法是创建一个新模型(假设您还没有进行任何迁移 - 如果您这样做,请小心删除它们),例如,&#34; rails generate model user&#34 ;。除其他外,生成器为该模型创建db迁移。运行db migrate rails时,rails会创建users表并根据现有数据库的当前状态创建schema.rb。从那时起,后续迁移将基于schema.rb以及所做的任何新更改。