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
而且效果很好。
就这些了。
希望对您有所帮助
在迁移时我收到以下错误消息:
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
而且效果很好。
就这些了。
希望对您有所帮助