Rails:我更新迁移文件然后运行db:migrate,但我的架构没有更新
-
06-07-2019 - |
题
我正在尝试在其中一个表格中添加一个额外的字段。
我在迁移文件中添加了该字段(在db \ migrate下), 然后运行'rake db:migrate',它运行没有麻烦。我的文本编辑器甚至告诉我我的schema.db文件已经更新,需要刷新。
架构文件不包含我的新字段,任何从我的视图中引用该字段的尝试都会失败。
我该怎么做?可以通过rails更新带有额外字段的表,而不必完全删除并重新创建数据库吗?
解决方案
http://guides.rubyonrails.org/migrations.html#changing-existing-migrations一>
编写迁移时偶尔会出错。如果您已经运行了迁移,那么您不能只编辑迁移并再次运行迁移:Rails认为它已经运行了迁移,因此在运行rake db:migrate时不会执行任何操作。您必须回滚迁移(例如使用
rake db:rollback
),编辑迁移,然后运行rake db:migrate
以运行更正的版本。
其他提示
在数据库中添加/更改内容时,应始终创建新的迁移文件。这是迁移的目的。迁移文件应该能够进行新的更改并撤消更改。这样一来,如果出现问题或者你改变主意,就可以轻松回滚到以前的迁移过程。
以下链接标记为“迁移剖析”和“编写迁移”的部分可能对您有所帮助。
解决了我自己的问题..
基本上,不是编辑运行脚手架时生成的原始迁移文件,而是为了实现目标而创建一个新的迁移文件:
我做了同样的事情,我想改变一个字段名称 而不是这个:
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.string :commenter
t.text :body
# this line adds an integer column called `article_id`.
t.references :article, index: true
t.timestamps
end
end
end
我改变了
t.text :body
到
t.text :comment_body
我试过做rake
db:migrate
没有发生任何事情,因为它再次进入命令提示符而没有任何输出...,我看着堆栈溢出和这个引导我做rake
db:migrate:redo
带出去
== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
-> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================
== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
-> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================
然后我用commenter_body而不是body加载我的页面/控制器,它完全加载。
我认为这也是同样的解决方案。我不知道在模型/数据库的底层工作中是否有任何问题(我仍然是新的RoR,我的第三天实际上......)
通过运行 rake db:schema:dump
不知道这是否适用,但值得一试。直接来自“敏捷开发与Rails,第3版”:
有时,此schema_migrations表可能会导致问题。例如,如果您创建
迁移源文件并在向文件添加任何模式定义语句之前运行 db:migrate
,
数据库会认为它已更新,架构信息表将包含新版本
数。
如果您再编辑现有的迁移文件并再次运行 db:migrate
,Rails就不会知道
应用您的新更改。在这些情况下,它通常最容易丢弃数据库,重新创建
它,并重新运行您的迁移。
一旦你做了rake db:migrate,那么你再也不能在该文件中添加列。你必须使用rails g migration add_columnname_to_tablename生成一个新的迁移文件来添加该特定列并执行rake db:migrate。就是这样! !