Rails: PG::UndefinedTable: ERROR: relation "..." does not exist

Rails: PG::UndefinedTable: ERROR: relation "..." does not exist

在迁移时我收到以下错误消息:

PG::UndefinedTable: ERROR:  relation "actioncodes" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_4ecaa2493e"
FOREIGN KEY ("actioncode_id")
  REFERENCES "actioncodes" ("id")

我有以下组织迁移文件:

class CreateOrganizations < ActiveRecord::Migration
  def change
    create_table :organizations do |t|
      t.string     :name,         null: false,    limit: 40
      t.references :actioncode,   index: true,    foreign_key: true
      t.boolean    :activated
      t.datetime   :activated_at

      t.timestamps null: false
    end
  end
end

对于 Actioncodes,我有迁移文件:

class CreateActioncodes < ActiveRecord::Migration
  def change
    create_table :actioncodes do |t|
      t.string  :code,          null: false,  limit: 20
      t.string  :description,                 limit: 255

      t.timestamps null: false
    end
  end
end
class AddIndexToActioncodesCode < ActiveRecord::Migration
  def change
    add_index :actioncodes, :code,  unique: true
  end
end

组织模型文件包括:belongs_to :actioncode.

而动作代码模型文件包括:has_many :organizations.

知道是什么导致了错误信息吗?

如果我从迁移文件中删除 index: true, foreign_key: true,它会顺利迁移。当我用不正确的行 t.references :actioncode_id, index: true, foreign_key: true 替换该行时,它给出了下面的错误,其中最后一行 ("ids") 建议 Rails 不知何故似乎与 table?

PG::UndefinedTable: ERROR:  relation "actioncode_ids" does not exist
: ALTER TABLE "organizations" ADD CONSTRAINT "fk_rails_604f95d1a1"
FOREIGN KEY ("actioncode_id_id")
  REFERENCES "actioncode_ids" ("id")

之所以会出现此问题,是因为 CreateOrganizations 在执行 CreateActioncodes 之前正在 运行 迁移。

CreateActioncodes 首先是 运行,从而确保 action codes table 存在。

迁移的顺序 运行 基于迁移的时间戳 - 如文件名所示。 20141014183645_create_users.rb 将 运行 在 20141014205756_add_index_to_users_email.rb 之前作为第二个时间戳 - 20141014205756 在第一个 - 20141014183645 之后。

确保 CreateOrganizations 迁移的时间戳在 CreateActioncodes 迁移的时间戳之后。

或者您可以手动更改文件名中的时间戳。或删除这些迁移文件,并按正确的顺序创建它们。

这一行的foreign_key: true

t.references :actioncode,   index: true,    foreign_key: true

告诉 Rails 在数据库中创建一个外键。 A foreign key:

constraint specifies that the values in a column (or a group of columns) must match the values appearing in some row of another table. We say this maintains the referential integrity between two related tables.

因此,数据库(它所属的位置)内部的一些逻辑确保您不能在 actioncode 列中放置无效值,并且您不能从 actioncodes 中删除条目table 正在别处使用。

为了创建约束,引用的 table (actioncodes) 需要在您引用它之前存在。看起来你的迁移正试图在 actioncodes 之前创建 organizations 所以你需要做的就是重命名 CreateOrganizations 迁移文件,这样它的时间戳前缀就在 CreateActioncodes 之后.前缀只是格式为 YYYYMMDDhhmmss 的时间戳,因此请将 CreateOrganizations 时间戳更改为 CreateActioncodes 时间戳再多一秒。

我也遇到了这个错误。如果您使用测试数据库 运行 rspec 确保在 运行 宁 rspec.[=11 之前在终端中 运行 rake db:test:prepare =]

我在 Ubuntu 20.04 中处理 Rails 6 应用程序时遇到了同样的挑战。

我在大学门户网站上工作,其中有一个名为 School 的模型和另一个名为 Program 的模型。模型 Program 属于模型 School,因此我需要在 programs table.

中添加一个 school 引用列

我使用这个命令来创建迁移文件:

rails generate model School name:string logo:json motto:text address:text

rails generate model Program name:string logo:json motto:text school_id:references

然而,当我运行命令时:rails db:migrate

我遇到了错误:

== 20201208043945 CreateSchools: migrating ====================================
-- create_table(:schools)
   -> 0.0140s
== 20201208043945 CreateSchools: migrated (0.0141s) ===========================

== 20201208043958 CreatePrograms: migrating ===================================
-- create_table(:programs)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR:  relation "school_ids" does not exist

我是这样解决的:

问题来自命令:

rails generate model Program name:string logo:json motto:text school_id:references

它应该是 school:references 而不是 school_id:references,所以在迁移过程中 Rails 无法找到 table school_ids

所以我修改了命令为:

rails generate model Program name:string logo:json motto:text school:references

而且效果很好。

就这些了。

希望对您有所帮助