web-dev-qa-db-ja.com

PG undefinedtableエラー関係ユーザーが存在しません

この質問は以前にもありましたが、rspecについてのみです。私にとってはあまりにも進歩しているので、まだテストを作成していませんが、いつの日かすぐになります! :P

アプリでサインアップ/ログインしようとすると、このエラーが発生します。どこで修正したらよいかわかりません。 deviseを使用してユーザーを作成し、omniauth2でサインインして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

#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #Host: localhost
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
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:

ありがとうございました!

84
Naomi K

最初に、データベースからすべての接続を切断する必要があります。デフォルトでは、development環境を使用します。次に、以下を使用してデータベースをリセットしてください。

rake db:reset

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

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

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

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

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

rake db:migrate:reset db:seed

db:migrate:resetはドロップを意味するため、データベースを作成して移行します。 rakeのデフォルト環境はdevelopmentであるため、specテストで例外が発生した場合、次のようにtest環境の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

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

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

Rails_ENV=test rake test:prepare

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

「PG :: Error:ERROR:database "[your_db_test]" is access by other user 'this run」というメッセージでrakeタスクが中止された場合

Rails_ENV=test rake db:migrate
14
Serge Seletskyy

私はこのエラーに遭遇し、研究の結果、PG undefinedtable error relation users not exist error isの理由の1つを見つけました。

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

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

rake db:migrate

Herokuを使用している場合

heroku run rake db:migrate
13
supritshah1289

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

壊れたコードは次のとおりです。

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

また、factories.rbのロード時にUserが定義されていなかったため、エラーが発生していました。 User.new呼び出しをブロックでラップし、問題を解決しました。

修正されたコード:

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

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

12
ehc

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
cedricdlb

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

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

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

10
Arcolye

私にとってその問題は、ファクトリーガールレールによって引き起こされていました。私はそれを使用して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)]}

詳細については、 ファクトリーガールの動的属性Rails docs を参照してください。

ファクトリーフォルダーの名前を忘れずに元に戻してください!

6
Igi Manaloto

::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のバグであり、苦労して不思議に思うのではなく、誰かを助けるかもしれません。

3
Kaleem Ullah

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

change_table(:users)

create_table(:users)
3
KnuturO

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

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
Muhammad Zubair

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

私はМалъСкрылевъの手順に従いましたが、それでも短くなりました。必要な最後の手順は、次を使用してスキーマをテストデータベースに読み込むことでした。

Rails_ENV=test rake db:schema:load

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

2
Stephen

Adminフォルダーを削除して、rakeを再度実行します。

2
Roberto Capelo

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

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

私にとっては、deviseUserモデルを読み取ってdevise(クラスメソッド、つまりdevise :database_authenticatable, :registerable #etc)の引数として何を持っているかを確認している

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

答えはUser行を除くdeviseモデルをコメントアウトすることでした*およびrake db:schema:loadは正常に動作するはずです。

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

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

2
MCB

最も可能性の高い原因は、rakeがwebserverとは異なるdatabase.ymlとは異なる環境を使用していることです。

1
techvineet

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

Routes.rbにGrape APIがマウントされます

mount API::Base => '/'

また、APIには欠落しているモデルへの参照がありました。 this answer のおかげで、サーバーで実行されているのか、移行中に実行されているのかを検出するブロックに入れました。

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

そしてそれは働いた。

1
Julian Mann

だから今、同じ問題を抱えている。各移行で1つのモデルのみを使用することを忘れないでください。それで解決しました。

私はここで答えに出会いました。

0
Rex

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

例えば。

add_column :images, :url, :string
0
user5783745

私の場合、2ActiveAdminファイルをコメントアウトする必要がありました。私の手順は次のとおりです。

  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(実行中の完全なトレースを見る--traceを使用)</ code>

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

同じエラー。

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

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

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

0
mecampbellsoup

まだこの問題を抱えている人にとっては、私の中にこのエラーを引き起こしていたFactoryGirlの工場​​がありました。

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

0
Mateus Luiz

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

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

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

0
John Chriest

次のエラーが発生し、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"
0
juliangonzalez