105

以前にこの質問を見ましたが、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ましたが、既に作成されています: スキーマ テーブルにユーザーが存在します。以前にこのエラーが発生した人はいますか?

データベース.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:
4

24 に答える 24

128

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

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データベースを削除、作成、および移行することを意味するため。デフォルトの環境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
于 2013-11-06T05:23:21.883 に答える
21

このエラーが発生しました。調査の結果、 PG undefinedtable error relationship users does not existエラーの理由の 1 つが次のとおりであることがわかりました。

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

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

rake db:migrate

heroku を使用している場合

heroku run rake db:migrate
于 2016-08-15T00:39:54.397 に答える
13

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

BROKEN コードは次のとおりです。

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

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

固定コード:

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

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

于 2015-01-21T01:49:23.967 に答える
13

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
于 2014-04-01T22:25:52.627 に答える
12

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

ActiveAdmin を使用している場合、PG が存在しないと言ったテーブルは、その ActiveAdmin rb ファイルの内容をコメントアウトします。

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

于 2013-12-02T07:02:01.757 に答える
2

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

于 2016-03-22T03:42:29.463 に答える
2

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

例えば。

add_column :images, :url, :string
于 2019-02-02T12:50:16.680 に答える
2

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

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

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

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

User答えは、行を除いてモデルをコメントアウトすることでしたdevise* 正常にrake db:schema:load実行されるはずです。

  • そうしないと、次のエラーが発生しました。

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

于 2016-05-13T20:54:16.787 に答える
1

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

于 2013-09-30T15:37:06.183 に答える
0

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

ここで答えにたどり着きました。

于 2016-02-25T00:05:55.033 に答える