【问题标题】:Rails: I update migration file then run db:migrate, but my schema isn't updatingRails:我更新了迁移文件,然后运行 ​​db:migrate,但我的架构没有更新
【发布时间】:2010-11-27 20:17:48
【问题描述】:

我正在尝试向我的一张表中添加一个额外的字段。

我已在迁移文件中添加了该字段(在 db\migrate 下), 然后运行'rake db:migrate',运行没有问题。我的文本编辑器甚至告诉我我的 schema.db 文件已更新,需要刷新。

架构文件不包含我的新字段,并且从我的视图中引用该字段的任何尝试都失败了。

我该怎么做?是否可以通过 rails 更新带有额外字段的表,而无需完全删除并重新创建数据库?

【问题讨论】:

    标签: ruby-on-rails dbmigrate schema.rb


    【解决方案1】:

    不知道这是否适用,但值得一试。直接来自“Agile Development with Rails,第 3 版”:

    有时这个 schema_migrations 表可能会给您带来问题。例如,如果您创建 迁移源文件并在向文件添加任何模式定义语句之前运行db:migrate, 数据库会认为它已经更新,并且架构信息表将包含新版本 数字。
    如果您随后编辑现有的迁移文件并再次运行 db:migrate,Rails 将不知道 应用您的新更改。在这些情况下,通常最容易删除数据库,重新创建 它,然后重新运行您的迁移。

    【讨论】:

      【解决方案2】:

      解决了我自己的问题..

      基本上,与其编辑运行脚手架时生成的原始迁移文件,不如创建一个新的迁移文件来实现您想要实现的目标:

      http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration

      【讨论】:

        【解决方案3】:

        在数据库中添加/更改某些内容时,您应该始终创建一个新的迁移文件。这就是迁移的目的。迁移文件应该能够进行新的更改和撤消更改。这样,如果出现问题或您改变主意,您可以轻松回滚到之前的迁移。

        以下链接中标记为“迁移剖析”和“编写迁移”的部分可能对您有所帮助。

        http://guides.rubyonrails.org/migrations.html

        【讨论】:

        • 即使听起来不错,我也从来没有回滚过。但这是真的,这就是迁移的好处……
        【解决方案4】:

        一旦您执行 rake db:migrate 之后,您将无法向该文件添加列。您必须使用 rails g migration add_columnname_to_tablename 生成新的迁移文件以添加该特定列并执行 rake db:migrate。就是这样! !

        【讨论】:

          【解决方案5】:

          http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

          编写迁移时有时会出错。如果您已经运行了迁移,那么您不能只是编辑迁移并再次运行迁移:Rails 认为它​​已经运行了迁移,因此当您运行 rake db:migrate 时不会执行任何操作。您必须回滚迁移(例如使用rake db:rollback),编辑您的迁移,然后运行rake db:migrate 以运行更正后的版本。

          【讨论】:

          • 这对我来说是一个方便的解决方案,因为我的数据库更改还没有被其他人使用。但我认为对于许多其他人来说,创建一个新的迁移比回滚迁移更安全,因为它会撤消迁移对架构所做的修改。但是我是 Rails 新手,所以也许有更多经验的人可以解释何时使用哪个选项?
          • 如果您已经发布(或提交,这取决于工作流)现有的迁移,您应该创建一个新的迁移而不是编辑现有的迁移。另一方面,如果您应用了一个新创建的迁移并且知道您在此之后错过了一些东西,您应该回滚并编辑迁移以避免过多无用迁移的混乱。
          【解决方案6】:

          通过运行rake db:schema:dump,我能够在以后的迁移中重新生成我的架构

          【讨论】:

            【解决方案7】:

            我做了同样的事情,我想更改一个字段名称和 而不是这个:

            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
            

            我试着做耙子

            db:migrate
            

            什么也没发生,因为它再次进入命令提示符而没有任何输出...,我查看了堆栈溢出,this 引导我进行 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 还是很陌生,实际上是我的第三天......)

            【讨论】:

            猜你喜欢
            • 2016-10-31
            • 1970-01-01
            • 2023-03-12
            • 1970-01-01
            • 2016-03-17
            • 1970-01-01
            • 1970-01-01
            • 2015-07-20
            • 1970-01-01
            相关资源
            最近更新 更多