この質問は以前にもありましたが、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:
ありがとうございました!
最初に、データベースからすべての接続を切断する必要があります。デフォルトでは、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
私はこのエラーに遭遇し、研究の結果、PG undefinedtable error relation users not exist error isの理由の1つを見つけました。
このエラーは移行エラーです。いくつかのデータベース属性を持つ新しいモデルを作成した可能性があります。モデルを作成したら、属性をRailsアプリスキーマに移行する必要があります。
開発にローカルマシンを使用している場合は、コマンドを使用できます
rake db:migrate
Herokuを使用している場合
heroku run rake db:migrate
同様のエラーが発生しました。私のエラーの根本は、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解決するためのものでした。
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
これは多くの場合、ActiveAdminのバグが原因です。バグを回避する方法は次のとおりです。
ActiveAdminを使用している場合、PGが存在しないと言うテーブルがあれば、そのActiveAdmin rbファイルの内容をコメント化します。
たとえば、この場合PGError: ERROR: relation "users" does not exist
の場合、app/admin/users.rb
の内容全体をコメントアウトし、移行が完了したらコメントを解除します。
私にとってその問題は、ファクトリーガールレールによって引き起こされていました。私はそれを使用して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 を参照してください。
ファクトリーフォルダーの名前を忘れずに元に戻してください!
::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のバグであり、苦労して不思議に思うのではなく、誰かを助けるかもしれません。
Usersテーブルを削除した後、この問題が発生しました。ソリューションは変化していました
change_table(:users)
に
create_table(:users)
私は同じ問題に直面していて、次の解決策を発見しました。
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
Rspecを使用してテストを実行しようとすると、同様のエラーが発生しました。
私はМалъСкрылевъの手順に従いましたが、それでも短くなりました。必要な最後の手順は、次を使用してスキーマをテストデータベースに読み込むことでした。
Rails_ENV=test rake db:schema:load
その後、問題はなくなり、次のバグに進むことができました。うまくいけば、いくつかの洞察が得られます。
Adminフォルダーを削除して、rakeを再度実行します。
(私はこれが古いことを知っていますが、将来のグーグルのために)
devise
を使用していますか?特にomniauthable
が問題であることは知っていますが、他の問題もあります。ただし、devise
である必要はありません。一般的に、解決策は、問題のあるモデル、クラスなどをコメントアウトし、エラーが要求するセクションのコメントを外すことです。
私にとっては、devise
がUser
モデルを読み取ってdevise
(クラスメソッド、つまりdevise :database_authenticatable, :registerable #etc
)の引数として何を持っているかを確認している
しかし、ファイル全体を読み取り、これが新しいプロジェクトではない場合、他のものに依存する他のクラスメソッドによってトリップされる可能性があります(私の場合はfriendly_id
gemで、その後alias_method
答えはUser
行を除くdevise
モデルをコメントアウトすることでした*およびrake db:schema:load
は正常に動作するはずです。
そうでなければ、私はこのエラーを受け取りました:
ArgumentError:omniauth_callbacksをomniauthableではないリソースにマッピングしていますUser
モデルにdevise :omniauthable
を追加してください
最も可能性の高い原因は、rakeがwebserverとは異なるdatabase.ymlとは異なる環境を使用していることです。
私はこの問題を抱えていましたが、原因は 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つのモデルのみを使用することを忘れないでください。それで解決しました。
移行中にこのエラーが発生した場合は、モデル名が複数であることを確認してください
例えば。
add_column :images, :url, :string
私の場合、2ActiveAdmin
ファイルをコメントアウトする必要がありました。私の手順は次のとおりです。
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
.
まだこの問題を抱えている人にとっては、私の中にこのエラーを引き起こしていたFactoryGirlの工場がありました。
「.new」または「.create」で参照を追加しようとしていました。
私はエラーをキャッチしていました:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "users" does not exist
LINE 8: WHERE a.attrelid = '"users"'::regclass
それは非常に簡単な修正であることが判明しました。プロジェクトの古いバージョンからファイルをコピーし、それらを「移行」フォルダー内にネストするのを忘れていました。私がそれをしたとき、それは私のために問題を解決しました。
次のエラーが発生し、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"