PG未定義のエラー関係ユーザーは存在しません


92

私は以前にこの質問を見ましたが、rspecについてのみです。まだ上級者なので、まだテストは作成していませんが、ある日すぐに作成します。:P

アプリにサインアップ/ログインしようとすると、このエラーが発生します。私はdeviseを使用してユーザーを作成し、omn​​iauth2を使用してgoogleでサインインしました。

これはエラーです

ActiveRecord::StatementInvalid at /users/auth/google_oauth2/callback
PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 5:              WHERE a.attrelid = '"users"'::regclass
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"users"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

私は試した rake db:migrateが、すでに作成されています:スキーマテーブルにユーザーが存在します 誰かが以前にこのエラーを経験しましたか?

database.yml

config = / opt / local / lib / postgresql84 / bin / pg_config

development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:

test:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_test
  pool: 5
  username: my_username
  password:

production:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_production
  pool: 5
  username: my_username
  password:

何か回答は役に立ちましたか?
МалъСкрылевъ

私にとっては、同じエラーがあり、回答がどれも役に立たなかった。
GustavoSemião-Lobo2014

@GustavoLoboは適切な移行をセットアップしていますか?
МалъСкрылевъ

8
実際、私は間違っていました。RAILS_ENV=test rake db:migrate私のために働いた。
グスタボSemião-Lobo14年

回答:


118

最初に、すべての接続をデータベースから切り離します。デフォルトでは、開発環境を使用します。次に、以下を使用してデータベースをリセットしてみます。

rake db:reset

rake db:resetタスクはデータベースを削除し、再度セットアップします。これは機能的にrake db:drop db:setupと同等です。

これは、すべての移行を実行することと同じではありません。現在のschema.rbファイルの内容のみを使用します。移行をロールバックできない場合、rake db:resetは役に立たない可能性があります。スキーマのダンプの詳細については、「スキーマのダンプとユーザー」セクションを参照してください。Railsドキュメント

トリックが役に立たない場合は、データベースを削除してから再作成し、データを移行します。シードがある場合は、データベースに播種します。

rake db:drop db:create db:migrate db:seed

または簡単に(3.2以降):

rake db:migrate:reset db:seed

以来db:migrate:reset低下を意味し、作成し、DBを移行します。のデフォルト環境rakedevelopmentであるため、スペックテストで例外が発生した場合は、次のようにテスト環境用のdbを再作成する必要があります。

RAILS_ENV=test rake db:drop db:create db:migrate

または移行したスキームをロードするだけで:

RAILS_ENV=test rake db:drop db:create db:schema:load

ほとんどの場合、テストデータベースはテスト手順の間にシードされているため、db:seedタスクアクションを渡す必要はありません。それ以外の場合は、データベースを準備する必要があります(これはRails 4では非推奨です)。

rake db:test:prepare

そして(それが実際に必要な場合):

RAILS_ENV=test rake db:seed

Railsの新しいバージョンでは、エラーActiveRecord :: NoEnvironmentInSchemaErrorが発生する可能性があるため、タスクの前にデータベース環境セットタスクを追加するだけです。タスクdb:environment:set

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate

私のために-RAILS_ENV =テストレーキdb:drop db:create db:schema:loadが機能します。答えてくれてありがとう。すばらしい
AMIC MING 2016

rake db:test:prepare仕事をします。
フランシスコキンテロ2016年

ありがとうございます、私の命を救ってください。ドロップ、作成、移行、セットアップを試みますが、コマンドを試すまで、これらのコマンドは機能しませんrake db:reset。魔法が起こる男!
Travis Le

18

私はこのエラーに遭遇し、私の調査の結果、PGの定義できないエラー関係のユーザーが存在しないエラーの原因の1つがエラーであることがわかりました:

このエラーは移行エラーです。いくつかのデータベース属性を持つ新しいモデルを作成した可能性があります。モデルを作成したら、属性をR​​ailsアプリスキーマに移行する必要があります。

ローカルマシンを使用している場合、開発にはコマンドを使用できます

rake db:migrate

Herokuを使用している場合

heroku run rake db:migrate

3
優れた!Rails 5の場合、「heroku run rails db:migrate」を使用する必要があります
Raphael Onofre

1
これでうまくいきました。私は走る必要がありましたrake db:migrate。ありがとう。
Proston Preston

14

テストデータベースはrspecの準備ができていません。

このエラーを修正するには、rspecのテストデータベースを準備します。

RAILS_ENV=test rake test:prepare

移行をドロップ、作成、テストデータベースに追加します

レーキタスクが「PG :: Error:ERROR:database "[your_db_test]」が他のユーザーによってアクセスされている」のようなメッセージで中止された場合、これを実行します

RAILS_ENV=test rake db:migrate

12

同様のエラーが発生しました。私のエラーの原因は、factories.rbファイルにRailsモデルへの参照があったことです。そのため、ロードエラーの問題が発生しました。修正は、参照をブロックでラップするか、{}、実行を遅延させることでした。

これが壊れたコードです:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end

そしてUser、factories.rbがロードされたときに定義されなかったため、エラーが発生しました。私はUser.new呼び出しをブロックで囲み、問題を解決しました:

修正されたコード:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end

注:このようにモデルを呼び出す必要があるのはおそらくベストプラクティスではありませんが、これは私のコードを乾燥させるための解決策でした。


「モデルを呼び出す必要があるのはおそらくベストプラクティスではない」理由を誰かが説明できますか?私はDRYの利点に同意します...欠点は何ですか?ありがとう!
theUtherSide 2016

11

rspecを実行すると、このエラーも発生しました。

 Failure/Error: it { expect(subject.priority_list).to eq [nil] * 9 }
 ActiveRecord::StatementInvalid:
   PG::UndefinedTable: ERROR:  relation "priorities" does not exist
   LINE 5:              WHERE a.attrelid = '"priorities"'::regclass
 ...

私が走った後それは私のために解決されました

rake db:test:prepare
rake db:test:load

11

多くの場合、これはActiveAdminのバグが原因です。バグを回避する方法は次のとおりです。

ActiveAdminを使用している場合、PGが存在しないと言うテーブルがあれば、そのActiveAdmin rbファイルの内容をコメント化します。

たとえば、この場合PGError: ERROR: relation "users" does not exist、の内容全体をコメント化し、app/admin/users.rb移行が完了したらコメントを外します。


これだけがうまくいきました。あなたは私の命の仲間を救った!ありがとう
micper

5

私にとってその問題は、Factory Girlのレールが原因でした。specs / factoriesフォルダーの名前をspecs / tempに変更して、

RAILS_ENV = your_environment bundle exec rake db:migrate --trace

合格した場合は、その原因を見つけただけです。Factory Girl Rails gem github repoを素早く掘り下げて、問題を特定するのに役立ちました。

実行時に存在しないモデルをインスタンス化しようとしていたため、工場は失敗していました!以下のコードサンプル:

FactoryGirl.define do
  factory :billing_product, class: 'Billing::Product' do
    name            Faker::Cat.name
    product_type    'fuel'
    active          true
    payment_options [Billing::PaymentOption.new(term: 1, payment_term: 1)]
  end
end

配列をブロックにカプセル化する({}を追加する)ことで修正されました。この例では、payment_optionsは複数の支払いオプションを取ることができることに注意してください...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

詳細については、Factory Girl Railsドキュメント動的属性の部分を参照してください。

工場フォルダの名前を元に戻すことを忘れないでください!


4

同じ問題に直面していて、次の解決策を見つけました。

以下の資格情報をすべてdatabase.ymlファイルに入力したこと、およびそれらが正しいことを確認してください。

development:
 adapter: postgresql
 encoding: unicode
 database: my_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz

test:
 adapter: postgresql
 encoding: unicode
 database: my_test_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz 

3

usersテーブルを削除した後、この問題が発生しました。ソリューションは変化していました

change_table(:users)

create_table(:users)

3

::Migration[5.0]移行で欠落していた。構文エラーをスローする代わりに、スローします

PG :: UndefinedTable:エラー:リレーションロールが存在しません

時間を浪費した後、私はようやく移行が欠落していることに気づきました::Migration[5.0]

誤った移行:

class CreateRoles < ActiveRecord # <---- Pay attention
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true

      t.timestamps
    end
  end
end

修正された正しい移行

class CreateRoles < ActiveRecord::Migration[5.0]
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true

      t.timestamps
    end
  end
end

これは、レールのバグである可能性があり、苦労して不思議に思う代わりに、誰かを助けるかもしれません。


はい!!!Rails 5の一般的な問題ですが、バグではないと思います。Railsは意図的にこれをActiveRecordから直接継承して
コミュニティ

2

rspecを使用してテストを実行しようとすると、同様のエラーが発生しました。

私はМалъСкрылевъのステップに従いましたが、それでもまだ足りませんでした。最後に、次の方法でスキーマをテストデータベースにロードしました。

RAILS_ENV=test rake db:schema:load

その後、問題はなくなり、次のバグに進むことができました。うまくいけば、それはあなたにいくつかの洞察を与えます。



2

(私はこれが古いことを知っていますが、将来のグーグルのために)

使っていdeviseますか?特にomniauthable問題があることはわかっていますが、他にも問題があるかもしれません。deviseしかし、そうである必要はありません。一般的な解決策は、問題のあるモデル、クラスなどをコメント化し、エラーが要求するセクションのコメントを外すことです。

私にとって、何が起こっていたかというdeviseと、Userモデルを読み取って、引数として持っているものdevise(クラスメソッドie devise :database_authenticatable, :registerable #etc)を確認することです。

しかし、それはファイル全体を読み取り、これが新しいプロジェクトでない場合、他のものに依存している他のクラスメソッドによってつまずかれる可能性があります(私の場合、それはfriendly_idgem でした。alias_method

答えはUserdevise行を除いてモデルをコメントアウトすることでした* ため、rake db:schema:load問題なく実行できます。

  • そうでなければ、私はこのエラーを受け取りました:

    ArgumentError:omniauthableではないリソースでomniauth_callbacksをマッピングdevise :omniauthableしますUserモデルに追加してください


2

移行中にこのエラーが発生した場合は、モデル名が複数であることを確認してください

例えば。

add_column :images, :url, :string

1

最も考えられる原因は、レーキがwebserverとは異なる環境をdatabase.ymlと使用していることです。


こんにちは、これはどのように確認できますか?端末に配置できるコマンドはありますか?
Naomi K

そしてあなたはどのようにあなたのウェブサーバーを始めていますか?
techvineet 2013

私は現在、ターミナルでレールを使用してローカルで実行しています
Naomi K

1

私にはこの問題があり、それはGrape APIが原因であることがわかりました。スタックトレースで、移行中にroutesファイルが読み取られていることに気付きました。

routes.rbにGrape apiがマウントされています

mount API::Base => '/'

APIには、不足しているモデルへの参照が含まれていました。したがって、この回答のおかげで、サーバーによって実行されているのか、移行中に実行されているのかを検出するブロックに入れました。

unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
    mount API::Base => '/'
end

そしてそれはうまくいった。


1

次のエラーが発生し、すべてのアプリケーションコードtype_zonesを検索しましたが、見つかりませんでした。私もdbを見て、更新されました。

/test/fixtures/type_zones.yml問題を引き起こしていたのは、フィクスチャの下のファイルであることが判明しました。

ERROR["test_should_get_new", UsersControllerTest, 0.47265757399145514]
test_should_get_new#UsersControllerTest (0.47s)
ActiveRecord::StatementInvalid:  ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "type_zones" does not exist
    LINE 1: DELETE FROM "type_zones"
                        ^
    : DELETE FROM "type_zones"

1

まだこの問題が発生している人にとって、私の場合、このエラーを引き起こしたのはFactoryGirlの私の工場でした。

「.new」または「.create」を使用して参照を追加しようとしました。


0

私の場合、2つの ActiveAdminファイルをコメント化する必要がありました。これが私のステップです:

  1. 初期エラー/スタックトレース(Solrこのプロジェクトで使用していることに注意してください): ⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = '"discussions"'::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"discussions"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in `' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)

上記のArcolyeの回答に従ってapp/admin/discussions.rbファイルをコメントアウトし、データベースを再度移行しようとしました。

同じエラー。

私はスタックトレースをもう少し詳しく見て、実際app/admin/users.rb:25に例外がスローされていることに気付きました-そして確かに、そのファイルはdiscussions(実行によって)テーブルに依存しています。Discussion.all)。

最後に、のコンテンツをコメント化すると、users.rb最終的にデータベースを正常に移行できました。

参考:必要なときにそのgemがデータベースをロードする必要があるかどうかについては、ここで議論がありActiveAdminます。



0

私はエラーをキャッチしていました:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass

それは非常に簡単な修正であることがわかりました。古いバージョンのプロジェクトからファイルをコピーして、「migrate」フォルダ内にネストするのを忘れていました。私がそれをしたとき、それは私のために問題を解決しました。


0

これは通常 、モデル間で誤ったタイプの関連付けを使用している場合に発生する可能性があります。たとえば、依存関係の破棄とhas_manyの関連付けを確認します。次に例を示します。

この問題を引き起こす可能性のある間違った方法:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

has_and_belongs_to_many :articles

正しい方法:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.