如何解决此Heroku数据库错误?

时间:2021-03-16 07:34:19

My app did not successfully deploy to Heroku and I am getting a database error that says this:

我的应用程序没有成功部署到Heroku,我收到一个数据库错误,上面写着:

PG::UndefinedTable: ERROR:  relation "topics" does not exist
: ALTER TABLE "blogs" ADD CONSTRAINT "fk_rails_7f5637ea0d"
FOREIGN KEY ("topic_id")
  REFERENCES "topics" ("id")

It seems to be saying that I do not have the reference of topic_id, but it is in my schema.rb file:

似乎是说我没有topic_id的引用,但它在我的schema.rb文件中:

ActiveRecord::Schema.define(version: 20170930175841) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "blogs", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "slug"
    t.integer "status", default: 0
    t.bigint "topic_id"
    t.index ["slug"], name: "index_blogs_on_slug", unique: true
    t.index ["topic_id"], name: "index_blogs_on_topic_id"
  end

  create_table "comments", force: :cascade do |t|
    t.text "content"
    t.bigint "user_id"
    t.bigint "blog_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["blog_id"], name: "index_comments_on_blog_id"
    t.index ["user_id"], name: "index_comments_on_user_id"
  end

  create_table "friendly_id_slugs", force: :cascade do |t|
    t.string "slug", null: false
    t.integer "sluggable_id", null: false
    t.string "sluggable_type", limit: 50
    t.string "scope"
    t.datetime "created_at"
    t.index ["slug", "sluggable_type", "scope"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type_and_scope", unique: true
    t.index ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type"
    t.index ["sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_id"
    t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type"
  end

  create_table "portfolios", force: :cascade do |t|
    t.string "title"
    t.string "subtitle"
    t.text "body"
    t.text "main_image"
    t.text "thumb_image"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "position"
  end

  create_table "skills", force: :cascade do |t|
    t.string "title"
    t.integer "percent_utilized"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "badge"
  end

  create_table "technologies", force: :cascade do |t|
    t.string "name"
    t.bigint "portfolio_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["portfolio_id"], name: "index_technologies_on_portfolio_id"
  end

  create_table "topics", force: :cascade do |t|
    t.string "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet "current_sign_in_ip"
    t.inet "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "roles"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

  add_foreign_key "blogs", "topics"
  add_foreign_key "comments", "blogs"
  add_foreign_key "comments", "users"
  add_foreign_key "technologies", "portfolios"
end

How do I go about troubleshooting an error that conflicts with what I see in my schema.rb file? Is the error telling me to go into postgres and add that constraint item? If so, how do I go about doing that?

如何解决与我在schema.rb文件中看到的错误相冲突的错误?错误告诉我进入postgres并添加该约束项吗?如果是这样,我该怎么做呢?

I have looked through this documentation:

我查看了这个文档:

https://devcenter.heroku.com/articles/postgres-logs-errors

https://devcenter.heroku.com/articles/postgres-logs-errors

but could not find anything remotely helpful to this case. I also reviewed this documentation:

但找不到任何远程帮助这种情况的东西。我还查看了这个文档:

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

PG :: UndefinedTable:错误:关系“...”不存在

but I am not sure if this is the answer. If I understand the above SO doc, my topics table should be created before the blogs table, but it is not because the timestamp show that the blog was created before the topics table. When I looked into it, indeed the blogs table was created before the topics table in my migrations.

但我不确定这是不是答案。如果我理解上面的SO文档,我的主题表应该在博客表之前创建,但不是因为时间戳显示博客是在主题表之前创建的。当我调查它时,确实在我的迁移中的主题表之前创建了博客表。

So what is the cleanest and most simple way to correct those dates so that the table is created first? Assuming this is the issue.

那么,最简​​洁,最简单的方法是纠正这些日期,以便首先创建表格?假设这是问题。

I have verified that the table of topics does exist locally via:

我已经验证主题表确实存在于本地:

ActiveRecord::Base.connection.tables
 => ["schema_migrations", "ar_internal_metadata", "friendly_id_slugs", "skills", "portfolios", "users", "topics", "blogs", "comments", "technologies"]
2.3.3 :002 >

However when I do this:

但是当我这样做时:

$ psql postgres
psql (9.6.1)
Type "help" for help.

postgres=# SELECT * FROM pg_tables WHERE tablename = 'topics';
 schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+-----------+------------+------------+------------+----------+-------------+-------------
(0 rows)

postgres=#

I realized via the help I am receiving from an SO community member that I needed to switch into the correct database and once I did that I confirmed that I have the "topics" table:

我通过SO社区成员的帮助意识到我需要切换到正确的数据库,一旦我这样做,我确认我有“主题”表:

postgres=# \connect <db_name>_development
You are now connected to database "<db_name>_development" as user "danale".
<db_name>_development=# SELECT * FROM pg_tables WHERE tablename = 'topics';
 schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
------------+-----------+------------+------------+------------+----------+-------------+-------------
 public     | topics    | danale     |            | t          | f        | t           | f
(1 row)

2 个解决方案

#1


1  

Table topics just has to be there before you can create a FK reference to it.

在创建FK引用之前,必须先使用表主题。

General SQL tools to help diagnose the situation

First, make sure you are connected to the right database in your various tests. And in the right DB cluster (host, port)!

首先,确保在各种测试中连接到正确的数据库。并在正确的数据库集群(主机,端口)!

SELECT current_database();

Connecting with psql postgres connects to the database named "postgres". (Standard maintenance db, don't create objects there, leave it alone.)

连接psql postgres连接到名为“postgres”的数据库。 (标准维护db,不要在那里创建对象,不管它。)

You are certain, the table exists? Check on that - in the right database:

你确定,桌子存在吗?检查 - 在正确的数据库中:

SELECT *
FROM   pg_tables
WHERE  tablename = 'topics';

There can be multiple tables of the same name in multiple schemas.

多个模式中可以有多个同名的表。

More:

更多:

And does the schema (schemaname) appear in your current search_path?

架构(schemaname)是否出现在当前的search_path中?

SHOW search_path;

More:

更多:

#2


0  

The REFERENCES "topics" ("id") seems to reference to "topics" table and field "id" in it. I don't see it created on create table? Admittedly it's been years, but shouldn't you be referring to an existing column?

REFERENCES“主题”(“id”)似乎引用了“主题”表和字段“id”。我没有看到它在创建表上创建?不可否认,这已经是几年了,但你不应该指现有的专栏吗?

#1


1  

Table topics just has to be there before you can create a FK reference to it.

在创建FK引用之前,必须先使用表主题。

General SQL tools to help diagnose the situation

First, make sure you are connected to the right database in your various tests. And in the right DB cluster (host, port)!

首先,确保在各种测试中连接到正确的数据库。并在正确的数据库集群(主机,端口)!

SELECT current_database();

Connecting with psql postgres connects to the database named "postgres". (Standard maintenance db, don't create objects there, leave it alone.)

连接psql postgres连接到名为“postgres”的数据库。 (标准维护db,不要在那里创建对象,不管它。)

You are certain, the table exists? Check on that - in the right database:

你确定,桌子存在吗?检查 - 在正确的数据库中:

SELECT *
FROM   pg_tables
WHERE  tablename = 'topics';

There can be multiple tables of the same name in multiple schemas.

多个模式中可以有多个同名的表。

More:

更多:

And does the schema (schemaname) appear in your current search_path?

架构(schemaname)是否出现在当前的search_path中?

SHOW search_path;

More:

更多:

#2


0  

The REFERENCES "topics" ("id") seems to reference to "topics" table and field "id" in it. I don't see it created on create table? Admittedly it's been years, but shouldn't you be referring to an existing column?

REFERENCES“主题”(“id”)似乎引用了“主题”表和字段“id”。我没有看到它在创建表上创建?不可否认,这已经是几年了,但你不应该指现有的专栏吗?