PG :: UndefinedTable:错误:关系"音乐家"不存在

时间:2016-02-12 09:29:31

标签: ruby-on-rails ruby postgresql heroku

rake db:migratesqlite3本地工作,但在heroku的postgresql中不起作用。

错误

PG::UndefinedTable: ERROR:  relation "musicians" does not exist
: ALTER TABLE "orders" ADD CONSTRAINT "fk_rails_ad134589be"
FOREIGN KEY ("musician_id")
  REFERENCES "musicians" ("id")
   (0.9ms)  ROLLBACK
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
PG::UndefinedTable: ERROR:  relation "musicians" does not exist
: ALTER TABLE "orders" ADD CONSTRAINT "fk_rails_ad134589be"
FOREIGN KEY ("musician_id")

以下是整个日志的链接:https://gist.github.com/helloravi/2cb69e0927e63e186b09

以下是未执行的迁移。该错误显示在迁移代码

下方
class CreateAlbums < ActiveRecord::Migration
  def change
    create_table :albums do |t|
      t.string :album_name
      t.references :musician, index: true, foreign_key: true
      t.timestamps null: false
    end
    add_foreign_key :albums, :users, column: :musician_id
  end
end

我有一个带有音乐家列的用户表,该列是布尔值(有些用户是音乐家)

我甚至尝试使用add_foreign_key,但我仍然无法弄清问题是什么。

我尝试了rake db:schema:load并且有效。我希望能够使rake db:migrate工作,因为我需要能够在生产中进行迁移。

2 个答案:

答案 0 :(得分:3)

SQLite不检查外键,只是忽略它们。但PostgreSQL非常严格,并且当外键约束无效时会引发错误。

Rails foreign_key不支持您希望它执行的操作。当您编写t.references :musician时,必须有一个musicians表。但是您希望外键指向users表。

我看到两个选项:

  1. 使用t.references :users并在albums.rb中重命名该关联,如下所示:

    belongs_to :musician, class_name: 'User', foreign_key: 'user_id'
    
  2. 或者:您只需使用t.integer :musician_id代替references,并使用execute 'ALTER TABLE ...'手动定义外键约束

答案 1 :(得分:1)

@spickermann所说的是正确的。 将迁移更改为以下内容应该有效:

class CreateAlbums < ActiveRecord::Migration
  def change
    create_table :albums do |t|
      t.string :album_name
      t.integer :musician_id
      t.timestamps null: false
    end
    add_foreign_key :albums, :users, column: :musician_id
    add_index :albums, :musician_id
  end
end