繁体   English   中英

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

[英]Why can I no longer rake db:migrate when adding new columns to my table? Can I add columns manually in the migration file or should I generate one?

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

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

  • 日期时间列,称为日期

在db / migrate /中为days表打开迁移文件,并添加以下列:一个名为date的datetime列在db / migrate /中为事件跟踪表打开迁移文件,并添加以下列:

  1. 名为name的字符串列
  2. 从中调用的日期时间列
  3. 日期时间列称为
  4. 称为位置的字符串列
  5. Day模型的参考列

到目前为止,我已经将其手动添加到了迁移文件中,如下所示:

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,这是输出:

迁移文件就像一个脚本 ,它以某种方式更改数据库。 它不存储数据库的状态。

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

因此,如果您运行一个脚本,然后对其进行更改,然后再执行db:migrate,它将不会再次运行它,因为它认为它已经运行了。 如果没有再次运行它,它可能会炸掉,因为它会尝试添加大量已经存在的列。

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

我假设您之前已经进行过迁移。 因此,存在一个名为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

希望这可以帮助。

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

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

每当您运行rake db:migrate时,它将使用每个迁移文件具有..的时间戳(例如YYYYMMDDHHMMSS_create_products.rb.运行所有待处理的迁移YYYYMMDDHHMMSS_create_products.rb.

rake db:migrate期间,将拾取任何具有比以前运行的迁移时间戳大的rake db:migrate ,然后检查rake db:migrate是否存在更改。 例如:对于迁移文件20080906120001_add_details_to_products.rb ...如果已运行,则所有更改将添加到数据库中。如果对其进行编辑然后再次运行,则不会将其作为迁移时间戳记应该比以前运行的文件要好一些,而不是。 您可以通过编辑一些数字来手动更改迁移,以便再次拾取它而无需创建新文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM