【问题标题】:Can't migrate db rails, getting an error无法迁移 db rails,出现错误
【发布时间】:2016-02-17 20:29:52
【问题描述】:

我在迁移数据库时遇到错误。错误是:

PG::UndefinedColumn: ERROR:  column roles.deleted_at does not exist
LINE 1: SELECT "roles".* FROM "roles"  WHERE ("roles"."deleted_at" I...
                                              ^
: SELECT "roles".* FROM "roles"  WHERE ("roles"."deleted_at" IS NULL)

这是我在 schema.rb 中的一部分:

create_table "roles", :force => true do |t|
t.string   "name"
t.string   "title"
t.integer  "resource_id"
t.string   "resource_type"
t.datetime "created_at",    :null => false
t.datetime "updated_at",    :null => false
t.datetime "deleted_at"
end

我试着做:

rails generate migration AddDeletedAtToRoles deleted_at           

但这并没有帮助。

【问题讨论】:

  • 你在使用acts_as_paranoid gem吗?您也可以在此处添加用于运行迁移的命令以及迁移文件。
  • "你的 schema.rb 的一部分"...你能告诉我们这是在哪里创建的 migration 吗?您的架构可能与他们不同步...

标签: ruby-on-rails ruby-on-rails-3 dbmigrate


【解决方案1】:

如果某个列存在于您的架构中,但由于找不到该列而导致迁移失败,则您可能处于不一致的数据库状态(即您的数据库当前架构与 schema.rb 不相符,您也无法像迁移一样迁移与您当前的状态不兼容)。有很多方法可以进入这种状态,但无论如何,最好的办法是清除数据库并再次迁移:

bin/rake db:reset db:migrate

如果这不起作用,您有更严重的问题。如果这是一个相当新的应用程序,bin/rake db:drop db:create db:migrate 可能会提供帮助;否则,您需要进行一些调试和调查。

【讨论】:

    【解决方案2】:

    有时我为了摆脱这些不一致的数据库状态所做的事情是,如果这是一个简单的修复,请进入实际数据库并手动修复任何似乎有问题的问题,以便再次进行迁移。

    在您的情况下,您似乎缺少角色表中的 deleted_at 列。所以你可以做的是自己创建列。为了在 Postgres 中做到这一点,您需要执行以下操作:

    1. psql your_database_name 一旦你在那里改变你的roles表并使用以下命令添加你缺少的列。
    2. ALTER TABLE roles ADD COLUMN deleted_at date;

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2017-09-26
      • 2017-08-03
      相关资源
      最近更新 更多