PG :: UndefinedTable:错误:关系" ..."不存在

时间:2015-05-17 18:03:00

标签: ruby-on-rails postgresql ruby-on-rails-4 rails-migrations

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

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替换该行时,它会给出下面的错误,其中最后一行(&#34; ids&#34;)表明Rails似乎在某种程度上对表的名称有问题?

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")

4 个答案:

答案 0 :(得分:15)

因此,问题正在发生,因为在CreateOrganizations执行之前正在运行CreateActioncodes迁移。

首先运行

CreateActioncodes,从而确保action codes表存在。

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

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

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

答案 1 :(得分:10)

此行中的foreign_key: true

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

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

  

约束指定列(或一组列)中的值必须与另一个表的某行中出现的值匹配。我们说这维护了两个相关表之间的参照完整性

因此,它是数据库中的一些逻辑(它所属的位置),可确保您无法在actioncode列中放置无效值,并且无法从actioncodes表中删除条目正在其他地方使用。

为了创建约束,引用的表(actioncodes)在引用之前需要存在。看起来您的迁移尝试在organizations之前创建actioncodes,因此您需要做的就是重命名CreateOrganizations迁移文件,使其时间戳前缀位于CreateActioncodes的前缀之后。前缀只是格式为YYYYMMDDhhmmss的时间戳,因此将CreateOrganizations时间戳更改为CreateActioncodes时间戳再多一秒。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

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

我正在大学门户网站上工作,我有一个名为School和另一个名为Program的模型。模型Program属于模型School,因此需要在school表中添加一个programs引用列。

我使用此命令创建了迁移文件:

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无法找到表school_ids

因此我将命令修改为:

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

效果很好。

仅此而已。

我希望这会有所帮助