bundle exec rake db:migrate 来自哪里?

Where does bundle exec rake db:migrate come from?

我想看看这个 rake 任务写在哪里以及它如何找到要迁移到的数据库。

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

当您 运行 db:migrate 时,rails 将检查一个名为 schema_migrations 的特殊 table,其中包含应用到的最后一次迁移的时间戳数据库。它将存储已经 运行.

的迁移文件的时间戳

此任务是 ActiveRecord 的一部分。您可以在此处查看它的定义位置:database_tasks.rb

基本上是任务调用 ActiveRecord::Migrator,它是负责将迁移应用到数据库的模块。

例如,如果您创建一个新的迁移并获得以下输出:

Running via Spring preloader in process 4675
      invoke  active_record
      create    db/migrate/20170621091940_create_user.rb

当您调用 db:migrate 任务时,它会调用 ActiveRecord::Migrator.migrate("db/migrate", 20170621091940) 并应用您的迁移。