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

时间:2017-10-03 00:14:39

标签: ruby-on-rails postgresql heroku

我的应用没有成功部署到Heroku,我收到的数据库错误说明了这一点:

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

似乎在说我没有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

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

我查看过这个文档:

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

但找不到任何远程帮助此案例的内容。我还审查了这份文件:

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

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

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

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

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

然而,当我这样做时:

$ 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=#

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

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 个答案:

答案 0 :(得分:0)

topics必须在您创建FK引用之前必须存在。

帮助诊断情况的常规SQL工具

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

SELECT current_database();

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

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

SELECT *
FROM   pg_tables
WHERE  tablename = 'topics';

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

更多:

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

SHOW search_path;

更多:

答案 1 :(得分:0)

REFERENCES "topics" ("id")似乎引用了&#34;主题&#34;表格和字段&#34; id&#34;在里面。我没有看到它在创建表上创建?不可否认,这已经很多年了,但你不应该指现有的专栏吗?

相关问题