Rails - 理解db:migrate

Kva*_*ass 2 ruby data-migration ruby-on-rails-3

我在理解Ruby on Rails中的迁移时遇到了一些麻烦.我的应用程序db\migrate\目录中有以下两个类(存储在单独的文件中):

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

class AddEmailUniquenessIndex < ActiveRecord::Migration
  def self.up
    add_index :users, :email, :unique => true
  end

  def self.down
    remove_index :users, :email
  end
end
Run Code Online (Sandbox Code Playgroud)

我很困惑这两个文件似乎是如何一起运行的.在创建第二个类时,Michael Hartl的书说"我们可以编辑用户表的迁移文件,但这需要回滚然后再迁移.Rails方法是每当我们发现我们的数据模型需要时使用迁移改变." 这些迁移实际上如何运作?迁移数据库时是否运行目录中的所有文件?就像这里的幕后情况一样?

btr*_*eat 7

按照惯例,这些迁移类的文件名将以创建它们的时间戳表示为前缀(例如20110611000000).运行db:migrate时,rails将检查数据库中的特殊表,该表包含应用于数据库的上次迁移的时间戳.然后,它将在该日期之后应用具有时间戳的所有迁移,并使用上次迁移的时间戳更新数据库表.因此,每个迁移类只应用一次到数据库.

迈克尔·哈特表示,如果你把所有的迁移到一个单一的文件,轨道将有哪些迁移已被应用,哪些早已不是硬/不可能报时.此时唯一的选择是删除数据库中的所有表,并从头开始运行所有迁移.功能上有效,但你会丢失所有数据.最好只在"前进"方向上移动而不是从开始然后再向前移动.

  • `运行db:migrate时,rails将检查数据库中的特殊表,该表包含应用于数据库的上次迁移的时间戳.表名是`schema_migrations`,它将存储已经运行的迁移文件的时间戳. (5认同)

Lar*_*y K 5

这些迁移实际上如何工作?

db:migrate是一项rake任务。db:migrate任务(内置的Rails支持程序)将搜索您项目的db / migrate目录,并使用其中的文件来更新数据库的架构。

迁移数据库时,目录中的所有文件都运行吗?否。在命令行上键入“ rake db:migrate”时,仅运行新的db / migrate文件(自上次运行db:migrate命令以来添加的文件)。

这意味着修改任何数据库/迁移文件是一个坏主意(不是Rails-way)。而是添加一个新文件。

像这里幕后发生的事情一样?Rails和db:migrate机制如何跟踪项目的db版本取决于Rails的版本。

补充:这是一些有关如何秘密进行迁移的好信息