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


92

나는 전에이 질문을 보았지만 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:

도움이 된 답변이 있습니까?
Малъ Скрылевъ

나를 위해, 같은 오류가 있고 어떤 답변도 도움이되지 않았습니다.
Gustavo Semião-Lobo 2014

@GustavoLobo 적절한 마이그레이션 설정이 있습니까?
Малъ Скрылевъ apr.

8
사실, 제가 틀렸어요. 죄송합니다. RAILS_ENV=test rake db:migrate나를 위해 일했습니다.
Gustavo Semião-Lobo 2014

답변:


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

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

나를 위해-RAILS_ENV = test rake db : drop db : create db : schema : load가 작동합니다. 답변 주셔서 감사합니다. Great
AMIC MING

rake db:test:prepare일을합니다.
Francisco Quintero 2016 년

내 생명을 구 해주셔서 감사합니다. 드롭, 생성, 마이그레이션, 설정을 시도하지만 명령을 시도 할 때까지 이러한 명령은 작동하지 않습니다 rake db:reset. 마법이 일어난다!
Travis Le

19

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

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

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

rake db:migrate

heroku를 사용하는 경우

heroku run rake db:migrate

3
우수한! Rails 5의 경우 'heroku run rails db : migrate'를 사용해야합니다.
Raphael Onofre

1
이것은 나를 위해 일했습니다. 나는 달려야했다 rake db:migrate. 감사.
Promise Preston

14

테스트 데이터베이스가 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

12

비슷한 오류가 발생했습니다. 내 오류의 근원은 내 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 혜택에 동의합니다 ... 결점은 무엇입니까? 감사!
theUtherSide

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


이것은 나를 위해 일했습니다. 당신은 내 생명을 구했어! 감사합니다
마이크

5

저에게 그 문제는 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 문서동적 속성 부분을 참조하십시오 .

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


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

사용자 테이블을 삭제 한 후이 문제가 발생했습니다. 솔루션이 변하고 있었다

change_table(:users)

...에

create_table(:users)

3

::Migration[5.0]마이그레이션에서 누락되었습니다. 대신 던지는 구문 오류 가 발생합니다

PG :: UndefinedTable : ERROR : 관계 역할이 없습니다.

시간을 낭비한 후 마침내 마이그레이션이 없다는 것을 알게되었습니다 ::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

(이것이 오래되었다는 것을 알고 있지만 미래의 Google 직원을 위해)

사용하고 devise있습니까? 나는 구체적 omniauthable으로 문제가 있다는 것을 알고 있지만 다른 사람들도 마찬가지입니다. 그럴 필요는 없습니다devise그래도 . 일반적으로 해결책은 문제가되는 모델, 클래스 등을 주석 처리하고 오류가 요청하는 섹션의 주석 처리를 제거하는 것입니다.

나를 위해 일어난 일은 당신이 인수로 가지고있는 것을보기 devise위해 User모델을 읽는 것입니다 devise(클래스 메서드 ie devise :database_authenticatable, :registerable #etc)

그러나 그것은 전체 파일을 읽을 것이고 이것이 새로운 프로젝트가 아니라면 다른 것들에 의존하는 다른 클래스 메소드에 의해 넘어 질 수 있습니다 (제 경우에는 friendly_id 보석alias_method

대답은 * 줄을 User제외하고 모델 을 주석 처리하는 것이 었으며 잘 실행되어야합니다.deviserake db:schema:load

  • 그렇지 않으면이 오류가 발생했습니다.

    오류 ArgumentError : omniauthable없는 자원에 매핑 omniauth_callbacks 추가하십시오 devise :omniauthable받는 User모델


2

마이그레이션하는 동안이 오류가 발생하면 모델 이름이 복수인지 확인하십시오.

예 :

add_column :images, :url, :string

1

가장 가능성이 높은 원인은 레이크가 웹 서버가 아닌 database.yml과 다른 환경을 사용하고 있기 때문입니다.


안녕하세요, 어떻게 확신 할 수 있습니까? 터미널에 넣을 수있는 명령이 있습니까?
Naomi K

웹 서버를 어떻게 시작하고 있습니까?
techvineet 2013 년

저는 지금 터미널에서 레일을 사용하여 로컬에서 실행 중입니다
Naomi K

1

나는이 문제가 있었고 Grape API 로 인한 것으로 판명되었습니다 . 스택 추적에서 마이그레이션 중에 경로 파일을 읽고 있음을 알았습니다.

route.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

그것은 매우 쉬운 해결책으로 밝혀졌습니다. 이전 버전의 프로젝트에서 파일을 복사했고 "마이그레이션"폴더 안에 중첩하는 것을 잊었습니다. 그렇게했을 때 문제가 해결되었습니다.


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.