为什么我在向表中添加新列时不再使用db:migrate?我可以在迁移文件中手动添加列,还是应该生成列?

时间:2015-04-16 14:50:14

标签: ruby-on-rails

大家早上好,     我正在尝试从Codeacademy完成日历应用程序,我需要完成以下步骤。

在db / migrate /中为days表打开迁移文件,并添加以下列:

  • 名为date
  • 的日期时间列

在db / migrate /中为days表打开迁移文件,并添加以下列: 一个名为date的日期时间列 在db / migrate / for events tracks表中打开迁移文件,并添加以下列:

  1. 名为name
  2. 的字符串列
  3. 调用的日期时间列
  4. 一个名为
  5. 的日期时间列
  6. 名为location
  7. 的字符串列
  8. 日模型的参考栏
  9. 到目前为止,我已将其手动添加到迁移文件中,如下所示:

    class CreateDays < ActiveRecord::Migration
      def change
        create_table :days do |t|
          t.datetime :date
          t.timestamps
        end
      end
    end
    
    class CreateEvents < ActiveRecord::Migration
      def change
        create_table :events do |t|
          t.string :name
          t.datetime :from 
          t.datetime :to 
          t.string :location 
          t.timestamps
          #Not sure how to add references column????
        end
      end
    end
    

    但是,当我运行rake db:migrate时遇到错误,我没有输出。应该有输出吗?我运行了rake db:migrate --trace,这里是输出:

4 个答案:

答案 0 :(得分:4)

迁移文件类似于脚本以某种方式更改您的数据库。它不存储数据库的状态。

除非你运行它,否则它不会做任何事情:你的数据库有一个特殊的表来跟踪已经运行的那些,称为schema_migrations。当您执行rake db:migrate时,根据该表运行该文件夹中尚未运行的所有脚本。

所以,如果你运行一个脚本,然后更改它,然后执行db:migrate,它就不会再运行它,因为它认为它已经运行了。如果 再次运行它,它可能会爆炸,因为它会尝试添加许多已经存在的列。

如果您在迁移中定义了一个表,后来想要添加更多列,您可以回滚迁移(这将删除表),然后使用添加的列再次运行它,或者编写一个新的迁移,只需添加所需的新列。后一种方法通常是最好的。

答案 1 :(得分:0)

我认为您之前已经运行过迁移。因此,有一个名为schema_migrations的表,它存储已经运行的迁移,因此您无法重新运行它们。将新列添加到现有表的最佳方法是创建一个新的迁移,如下所示:

rails g migration add_some_columns_to_events name:string

并命名其他列。如果你需要使用现有的迁移,那么你可以做的是:

rake db:migrate:down VERSION=<version_of_migration>

然后将迁移文件中的列添加起来并运行:

rake db:migrate:up VERSION=<version_of_migration>

您还可以回滚上次迁移并使用以下命令重新运行迁移:

rake db:rollback

希望这有帮助。

答案 2 :(得分:0)

您只能运行一次迁移 - 如果您已经运行迁移,则有两种选择:

  • 您可以使用rake db:rollback 回滚迁移,编辑它,然后使用rake db:migrate
  • 再次运行它
  • 您可以生成新的迁移并将更改放入其中。然后,您可以使用rake db:migrate
  • 运行新迁移

答案 3 :(得分:0)

每当您运行rake db:migrate时,它都会使用每个迁移文件具有的时间戳运行所有挂起的迁移。例如YYYYMMDDHHMMSS_create_products.rb.

rake db:migrate期间将挑选任何迁移大于先前运行的迁移时间戳的文件,然后检查数据库中是否存在更改。 例如 : 对于迁移文件20080906120001_add_details_to_products.rb ...如果您已经运行它,那么所有更改都将添加到db中。如果您对其进行编辑,然后再次运行它,那么它将不会被捕获,因为迁移的时间戳应该然后是grater然后运行文件,这不是。 您可以通过编辑少量数字来手动更改迁移,以便在不创建新文件的情况下再次拾取它。

我建议创建一个新的,因为它们是维护方式,每个迁移都应该是唯一的。