【问题标题】:Rails migrations over an existing database通过现有数据库进行 Rails 迁移
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我接受这个答案作为“the”答案。基本上,据我了解,Rails 不会帮助您处理现有数据库。在提到的t.recoverable 示例中,“手动”添加字段是不行的。所以简短的回答是:“没有铁轨无法处理”。感谢您的 cmets 和答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 2018-04-24
    • 2016-10-15
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多