我正在创建一个新的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上看到了类似的问题,但没有人回答这个问题。谢谢你的回答。
答案 0 :(得分:10)
如果您使用的是现有数据库,则不应尝试通过迁移覆盖它,您应该在schema.rb中复制现有数据库,然后从那里向前迁移,只添加已更改的字段。
答案 1 :(得分:1)
我采取的一种方法是创建一个新模型(假设您还没有进行任何迁移 - 如果您这样做,请小心删除它们),例如,&#34; rails generate model user&#34 ;。除其他外,生成器为该模型创建db迁移。运行db migrate rails时,rails会创建users表并根据现有数据库的当前状态创建schema.rb。从那时起,后续迁移将基于schema.rb以及所做的任何新更改。