5

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

4

2 回答 2

10

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

于 2011-07-24T21:17:23.563 回答
1

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

于 2013-01-22T18:10:13.753 回答