在db / migrate /中为days表打开迁移文件,并添加以下列:
在db / migrate /中为days表打开迁移文件,并添加以下列: 一个名为date的日期时间列 在db / migrate / for events tracks表中打开迁移文件,并添加以下列:
到目前为止,我已将其手动添加到迁移文件中,如下所示:
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,这里是输出:
答案 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然后运行文件,这不是。
您可以通过编辑少量数字来手动更改迁移,以便在不创建新文件的情况下再次拾取它。
我建议创建一个新的,因为它们是维护方式,每个迁移都应该是唯一的。