当前位置: 首页 > 知识库问答 >
问题:

Rails编辑迁移以忽略错误

闻人鸿文
2023-03-14

我有一个应用程序,上面有帖子、用户、标签等等。我一直在本地进行这项工作,但由于一个问题,无法将其推给heroku。最后,我成功地将我的应用程序推到了heroku,然后意识到我从未在那里迁移过我的数据库。所以我跑了

heroku run rake db:migrate

并得到这个错误:

== 20141116151429 CreatePosts: migrating ======================================
-- drop_table(:posts)
PG::UndefinedTable: ERROR:  table "posts" does not exist
: DROP TABLE "posts"
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  table "posts" does not exist

我查了一下迁移,出于某种原因,它在其他任何事情之前都有删除表行:

class CreatePosts < ActiveRecord::Migration
  def change
    drop_table :posts
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end
end

我注释掉了drop table行,甚至删除了它,然后使用git commit提交,然后尝试运行heroku rake db:migrate,但仍然显示错误。我知道这是一场严重的混乱,但我不知道接下来该怎么办。

我没有尝试重置数据库,因为担心会出什么问题,尽管从技术上讲,我可能会丢失我迄今为止创建的帖子/用户/评论等。

有没有办法补救这个问题,并且仍然将所有数据库数据推送到heroku?如果没有,我首先应该做什么才能让应用程序运行?

编辑:

我甚至将迁移更改为:

class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end

  def down
    drop_table :posts
  end
end

但错误依然存在。我不明白:我知道我编辑了正确的文件(2014111615429_create_posts.rb),然后删除了那一行。甚至更改了它的全部内容并提交了这些更改,但运行heroku rake db:migrate仍然会出现drop_tables错误。

据我所知,heroku rake db:迁移不是与rake db:迁移几乎相同吗?如果是这样,那么它应该运行挂起的迁移。在这种情况下,所有这些都是,因为我从未迁移到heroku。如果是这样,那么我对未运行的迁移文件所做的任何更改都应该得到反映。然而我得到了这个错误。

共有3个答案

暨嘉
2023-03-14

如果你使用'change',下降线是没有用的

 # == Reversible Migrations
  #
  # Starting with Rails 3.1, you will be able to define reversible migrations.
  # Reversible migrations are migrations that know how to go +down+ for you.
  # You simply supply the +up+ logic, and the Migration system will figure out
  # how to execute the down commands for you.
  #
  # To define a reversible migration, define the +change+ method in your
  # migration like this:
  #
  #   class TenderloveMigration < ActiveRecord::Migration
  #     def change
  #       create_table(:horses) do |t|
  #         t.column :content, :text
  #         t.column :remind_at, :datetime
  #       end
  #     end
  #   end
  #
   class CreatePosts < ActiveRecord::Migration
      def change
        create_table :posts do |t|
          t.string :title,              null: false, default: ""
          t.text :description, null: false, default: ""

          t.timestamps
        end
      end
    end
郭元凯
2023-03-14

这太尴尬了。

感谢@Dipak和@RubyOnRails的快速回复。

在第一次提交之后,我的提交似乎完全忽略了迁移文件。我返回并对添加的更改进行了干净的提交,迁移过程中没有出现任何问题。

也许在第一次之后我对希罗库的promise没有实现。

尴尬。

杨彦君
2023-03-14

当您注释掉drop_table语法时,它应该可以工作。但是如果它不起作用,请尝试使用下面的语法。

只有当数据库中存在表时,它才会运行drop_table

class CreatePosts < ActiveRecord::Migration
  def change
    drop_table 'posts' if ActiveRecord::Base.connection.table_exists? 'posts'
    create_table :posts do |t|
      t.string :title,              null: false, default: ""
      t.text :description, null: false, default: ""

      t.timestamps
    end
  end
end
 类似资料:
  • 问题是,如果整个迁移运行,那么我将用另一列替换列,并修复外键。那么,有什么方法可以忽略迁移的约束呢?

  • 我试图使用这个迁移,但我不断地得到错误,就像下面这样 这是我的迁移文件 SQLite3::SQLException:表“Employees”已存在:创建表“Employees”(“ID”整数主键AUTOINCREMENT NOT NULL,“name”varchar(255),“hiredate”date,“salary”float,“fulltime”boolean DEFAULT NOT“,”

  • 我对rails迁移有一个奇怪的问题。我的db/migrate文件夹包含迁移文件,所有文件都工作正常。但几分钟前,我使用rails g migration MigrationName创建了一个新文件,它生成了一个新文件。然后,当我运行rakedb:migrate时,它会回滚所有内容,我的模式版本变为0。现在,当我运行rake db:migrate时,它什么也不做,而db/migrate包含我的所有迁

  • 我将sql迁移放在项目的rcourses文件夹中,但是我们需要创建一个基于Java的迁移,我们将其放在同一个文件夹中:http://i.stack.imgur.com/J8XEH.png 出于某种原因,基于Java的迁移被完全忽略:http://i.stack.imgur.com/9mqkk.png 我可以不将这两种类型的迁移混合在一起吗?

  • 我们面临一个问题:假设一个开发人员在处理分支a的过程中提供了一个新的迁移版本,比如说V331,同时一个QA人员在另一个分支B的QA环境中进行QA。可能会出现qa环境已经有v331版本的情况,因为几个开发人员可能会在不同的时间在不同的分支上创建相同的版本号……更多的是qa经常在分支之间切换,这就是qa数据库变得混乱的原因,特别是表schema_version,这导致我们手动删除损坏的模式版本,解决旧

  • 这一节介绍你可能遇到的在不同情况下如何分析和编写数据库迁移. 有关迁移的入门资料,请查看 the topic guide. 数据迁移和多数据库 在使用多个数据库时,需要解决是否针对某个特定数据库运行迁移。例如,你可能 只 想在某个特定数据库上运行迁移。 为此你可以在RunPython中通过查看schema_editor.connection.alias 属性来检查数据库连接别名: from dja