[ruby-on-rails] PG 정의 할 수없는 오류 관계 사용자가 존재하지 않습니다.

나는 전에이 질문을 보았지만 rspec에만 해당됩니다. 시험이 너무 발전해서 아직 만들지는 못했지만 언젠가는 그렇게 할 것입니다! :피

내 앱에 가입 / 로그인하려고 할 때이 오류가 발생합니다. 나는 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

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:



답변

먼저 데이터베이스에서 모든 연결을 분리해야합니다. 기본적으로 개발 환경 을 사용 합니다. 그런 다음 다음을 사용하여 데이터베이스를 재설정하십시오.

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 오류가 발생할 수 있으므로 데이터베이스 환경 설정 task : db : environment : set를 작업 앞에 추가하기 만하면 됩니다 .

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


답변

이 오류가 발생했으며 연구 결과 PG 정의 할 수없는 오류 관계 사용자가 오류가 존재하지 않는 이유 중 하나 는 다음과 같습니다.

이 오류는 마이그레이션 오류입니다. 일부 데이터베이스 속성을 사용하여 새 모델을 생성했을 수 있습니다. 모델을 생성 한 후 속성을 Rails 앱 스키마로 마이그레이션해야합니다.

로컬 머신을 사용하는 경우 개발을 위해 명령을 사용할 수 있습니다.

rake db:migrate

heroku를 사용하는 경우

heroku run rake db:migrate


답변

테스트 데이터베이스가 rspec을 사용할 준비가되지 않았습니다.

이 오류를 수정하려면 rspec에 대한 테스트 데이터베이스를 준비하십시오.

RAILS_ENV=test rake test:prepare

테스트 데이터베이스에 마이그레이션을 삭제, 생성 및 추가합니다.

rake task가 ‘PG :: Error : ERROR : database “[your_db_test]”is being access by other users’와 같은 메시지와 함께 중단 된 경우 이것을 실행하십시오.

RAILS_ENV=test rake db:migrate


답변

비슷한 오류가 발생했습니다. 내 오류의 근원은 내 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

참고 : 아마도 이와 같이 모델을 호출 할 필요가있는 모범 사례는 아니지만 내 코드를 건조시키는 솔루션이었습니다.


답변

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를 주석 처리 한 다음 마이그레이션을 완료 한 후 주석 처리를 제거합니다.


답변

저에게 그 문제는 Factory Girl 레일로 인해 발생했습니다. specs / factories 폴더의 이름을 specs / temp로 바꾸고 시도하는 사람들에게 권장합니다.

RAILS_ENV = your_environment 번들 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 {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

자세한 정보 는 Factory Girl Rails 문서동적 속성 부분을 참조하십시오 .

공장 폴더의 이름을 다시 바꾸는 것을 잊지 마십시오!