【问题标题】:Rails 4: Re-Migrating all Migrations to SchemaRails 4:将所有迁移重新迁移到 Schema
【发布时间】:2017-03-27 17:19:54
【问题描述】:

我目前正在开发一个 Rails 4 应用程序,在过去的几个月里,我收集了许多独特的迁移文件,这些文件可以逆转自己的更改等。
由于我在这个开发阶段重置数据库没有问题,我想我可以稍微清理一下这个烂摊子。

有没有办法重做所有迁移文件,同时还允许删除某些迁移文件并扩展其他文件?

我感谢每一个答案!


示例(编辑)

我有两个迁移文件:

  1. 20160911071103_create_items.rb
  2. 20160918085621_add_cached_votes_to_items.rb

两者都已迁移。

之前的第一个文件

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|

      t.integer :user_id

      t.timestamps null: false
    end
  end
end

我的目标是将第二个文件添加的列直接包含在第一个文件中并删除第二个。

之后的第一个文件

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|

      t.integer :user_id
      t.integer :cached_votes

      t.timestamps null: false
    end
  end
end

【问题讨论】:

  • 不确定重做所有迁移文件是什么意思?你可以给出你的应用程序的实际例子,我认为这会更有意义!
  • @dkp 添加了一个示例
  • rake db:reset
  • 我认为根本没有必要保留旧的迁移文件。在所有环境中运行迁移后,您可以保存以删除它们。无论如何,您当前的数据库方案存储在schema.rb 中。该文件用于设置测试数据库。新开发人员通常会从数据库转储开始,或者也可以使用schema.rb。为什么要维护旧的迁移?你想达到什么目标?
  • @spickermann 如果可能的话,我基本上想再次从一个空白模式开始,然后迁移我所有更改的迁移文件。

标签: ruby-on-rails ruby database ruby-on-rails-4 migration


【解决方案1】:

如果您有一个有效的schema.rb 文件。你可以只生成一个迁移文件

bundle exec rails generate migration CreateItemsNew

然后将代码块create_table "items" 从您的工作schema.rb 填充到这个新生成的迁移文件中。然后批量搜索 db/migrate 中更改表 items 的所有迁移并删除这些文件。这样,您的数据库中的表就会有一个迁移文件。

【讨论】:

    【解决方案2】:

    你需要跑

    rake db:migrate:down VERSION=20160918085621

    rake db:migrate:down VERSION=20160911071103

    您现在可以通过rake db:migrate:status 查看迁移状态,您应该会得到如下迁移状态:

    down 20160911071103
    down 20160918085621
    

    现在,您可以删除迁移文件20160918085621_add_cached_votes_to_items.rb

    并根据需要编辑迁移文件20160911071103_create_items.rb。

    最后运行:

    rake db:migrate:up VERSION=20160911071103

    【讨论】:

      【解决方案3】:

      正如您所说,它只是在开发中,因此您可以更改迁移文件。

      注意:不建议编辑您的迁移,但因为它没有部署在任何地方,所以您可以这样做。

      20160911071103_create_items.rb

      class CreateItems < ActiveRecord::Migration
        def change
          create_table :items do |t|
      
            t.integer :user_id
      
            t.timestamps null: false
          end
        end
      end
      

      20160918085621_add_cached_votes_to_items.rb

      class AddCachedVotesToItems < ActiveRecord::Migration
        def change
          add_column :items, :cached_votes, :integer
        end
      end
      

      修改您的第一个迁移并记住删除第二个迁移。

      20160911071103_create_items.rb(迁移 1 + 迁移 2)

      class CreateItems < ActiveRecord::Migration
        def change
          create_table :items do |t|
      
            t.integer :user_id
            t.integer :cached_votes
      
            t.timestamps null: false
          end
        end
      end
      

      然后Drop 和Migrate 再次

      rake db:drop # Drop the db
      
      rake db:setup # Create and migrate the db
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-09
        • 2014-10-30
        • 2020-12-07
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多