Người dùng quan hệ lỗi không xác định được PG không tồn tại


92

Tôi đã thấy câu hỏi này trước đây, nhưng chỉ dành cho rspec. Tôi chưa tạo thử nghiệm vì nó quá nâng cao đối với tôi nhưng một ngày không xa tôi sẽ làm được! : P

Tôi gặp lỗi này khi cố gắng đăng ký / đăng nhập vào ứng dụng của mình. Tôi đã sử dụng devise để tạo người dùng và cũng có omniauth2 để đăng nhập với google .

đây là lỗi

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

Tôi đã thử rake db:migrate, nhưng nó đã được tạo: trong bảng lược đồ tồn tại người dùng. Có ai bị lỗi này trước đây không?

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:

Có câu trả lời nào hữu ích không?
Малъ Скрылевъ

Không phải đối với tôi, có cùng một lỗi và không có câu trả lời nào hữu ích.
Gustavo Semião-Lobo

@GustavoLobo bạn đã thiết lập di chuyển thích hợp chưa?
Малъ Скрылевъ

8
Thực sự là tôi đã sai, xin lỗi vì điều đó. RAILS_ENV=test rake db:migrateđã làm cho tôi.
Gustavo Semião-Lobo

Câu trả lời:


118

Lúc đầu, bạn sẽ tách tất cả các kết nối ra khỏi cơ sở dữ liệu. Theo mặc định, bạn sử dụng môi trường phát triển . Sau đó, hãy thử đặt lại cơ sở dữ liệu bằng cách sau:

rake db:reset

Tác vụ rake db: reset sẽ thả cơ sở dữ liệu và thiết lập lại. Chức năng này tương đương với rake db: drop db: setup.

Điều này không giống như chạy tất cả các quá trình di chuyển. Nó sẽ chỉ sử dụng nội dung của tệp schema.rb hiện tại. Nếu quá trình di chuyển không thể quay lại, rake db: reset có thể không giúp được bạn. Để tìm hiểu thêm về kết xuất lược đồ, hãy xem phần Bán phá giá lược đồ và Bạn. Rails Docs

Nếu thủ thuật không hữu ích, hãy xóa cơ sở dữ liệu, sau đó tạo lại nó một lần nữa, di chuyển dữ liệu và nếu bạn có hạt giống, hãy gieo cơ sở dữ liệu:

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

hay nói một cách ngắn gọn (kể từ 3.2):

rake db:migrate:reset db:seed

db:migrate:resetngụ ý thả, tạo và di chuyển db. Bởi vì môi trường mặc định cho rakephát triển , trong trường hợp nếu bạn thấy ngoại lệ trong các thử nghiệm thông số, bạn nên tạo lại db cho môi trường thử nghiệm như sau:

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

hoặc chỉ cần tải lược đồ đã di chuyển:

RAILS_ENV=test rake db:drop db:create db:schema:load

Trong hầu hết các trường hợp, cơ sở dữ liệu thử nghiệm đang được gieo trong quá trình thử nghiệm, vì vậy db:seedhành động tác vụ không bắt buộc phải được thông qua. Nếu không, bạn phải chuẩn bị cơ sở dữ liệu (điều này không còn được dùng trong Rails 4 ):

rake db:test:prepare

và sau đó (nếu nó thực sự được yêu cầu):

RAILS_ENV=test rake db:seed

Trên các phiên bản mới hơn của Rails, lỗi ActiveRecord :: NoEnosystemInSchemaError có thể xuất hiện, vì vậy chỉ cần thêm trước các tác vụ với tác vụ đặt môi trường cơ sở dữ liệu: db: environment: set :

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

cho tôi - RAILS_ENV = kiểm tra rake db: thả db: tạo db: schema: tải hoạt động, cảm ơn đã trả lời. Tuyệt vời
AMIC MING

rake db:test:prepareLàm công việc.
Francisco Quintero

Cảm ơn bạn Ông bạn chỉ cần cứu cuộc sống của tôi. Tôi cố gắng thả, tạo, di chuyển, thiết lập nhưng không phải bất kỳ lệnh nào trong số đó hoạt động cho đến khi tôi thử bạn lệnh rake db:reset. Điều kỳ diệu xảy ra con người!
Travis Le

18

Tôi đã gặp lỗi này và sau khi nghiên cứu, tôi phát hiện ra rằng một trong những lý do khiến người dùng có quan hệ lỗi PG không xác định được không tồn tại lỗi là:

Lỗi này là lỗi di chuyển. Bạn có thể đã tạo mô hình mới với một số thuộc tính cơ sở dữ liệu. Sau khi tạo mô hình, bạn phải di chuyển các thuộc tính sang lược đồ ứng dụng rails của mình.

Nếu bạn đang sử dụng máy cục bộ, để phát triển, bạn có thể sử dụng lệnh

rake db:migrate

Nếu bạn đang sử dụng heroku

heroku run rake db:migrate

3
Thông minh! Đối với đường ray 5 bạn phải sử dụng 'Heroku chạy đường ray db: di chuyển'
Raphael Onofre

1
Điều này đã làm việc cho tôi. Tôi cần phải chạy rake db:migrate. Cảm ơn.
Hứa với Preston

14

Cơ sở dữ liệu thử nghiệm của bạn chưa sẵn sàng cho rspec.

Chuẩn bị cơ sở dữ liệu thử nghiệm của bạn cho rspec để sửa lỗi này

RAILS_ENV=test rake test:prepare

Nó sẽ thả, tạo và thêm di chuyển vào cơ sở dữ liệu thử nghiệm của bạn

Trong trường hợp tác vụ rake bị hủy bỏ với thông báo như 'PG :: Lỗi: ERROR: cơ sở dữ liệu "[your_db_test]" đang được truy cập bởi người dùng khác, hãy thực thi thông báo này

RAILS_ENV=test rake db:migrate

12

Tôi đã gặp một lỗi tương tự. Nguyên nhân của lỗi của tôi là tôi có tham chiếu đến mô hình Rails trong tệp factory.rb của mình. Vì vậy, nó gây ra một vấn đề lỗi tải. Cách khắc phục là bọc tham chiếu trong một khối hoặc {}để nó trì hoãn việc chạy nó.

Đây là mã BROKEN:

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

Và nó đã bị lỗi vì Userkhông được xác định khi nào các factory.rb đang được tải. Tôi đã gói User.newcuộc gọi trong một khối và nó đã giải quyết được sự cố:

Mã cố định:

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

Lưu ý: có lẽ không phải là phương pháp hay nhất để gọi mô hình của bạn như thế này, nhưng đó là một giải pháp để KHÔ mã của tôi.


Bất cứ ai có thể vui lòng giải thích tại sao nó "có lẽ không phải là phương pháp hay nhất để cần gọi người mẫu của bạn"? Tôi đồng ý với những lợi ích KHÔ ... những hạn chế là gì? Cảm ơn!
theUtherSide

11

Tôi cũng gặp lỗi này khi chạy 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
 ...

Nó đã được giải quyết cho tôi sau khi tôi chạy

rake db:test:prepare
rake db:test:load

11

Điều này thường do lỗi trong ActiveAdmin gây ra. Đây là cách khắc phục lỗi:

Nếu bạn đang sử dụng ActiveAdmin, bất kỳ bảng nào PG cho biết không tồn tại, hãy nhận xét nội dung của tệp rb ActiveAdmin đó.

Ví dụ: đối với trường hợp này PGError: ERROR: relation "users" does not exist, hãy nhận xét toàn bộ nội dung của app/admin/users.rb, sau đó bỏ ghi chú sau khi bạn thực hiện xong việc di chuyển.


Chỉ điều này làm việc cho tôi. Bạn đã cứu cuộc sống của tôi, người anh em! Cảm ơn
micper

5

Vấn đề đối với tôi là do Factory Girl rails gây ra. Tôi muốn khuyên những người sử dụng nó đổi tên thư mục specs / factory thành specs / temp và cố gắng

RAILS_ENV = your_enosystem pack Operating rake db: migrate --trace

Nếu nó trôi qua, thì bạn chỉ cần tìm thấy những gì đã gây ra nó. Tìm hiểu nhanh về repo gem github của Factory Girl Rails đã giúp tôi xác định vấn đề.

Các nhà máy đã thất bại bởi vì tôi đang cố gắng tạo ra một Mô hình không tồn tại khi đang chạy! Mẫu mã bên dưới:

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

Đóng gói Mảng trong một khối (thêm {}) đã giải quyết được vấn đề cho tôi. Lưu ý rằng pay_options có thể có nhiều hơn một tùy chọn thanh toán trong ví dụ ...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

Tham khảo phần Thuộc tính động của tài liệu Factory Girl Rails để biết thêm thông tin.

Đừng quên đổi tên thư mục nhà máy của bạn trở lại!


4

Tôi đã đối mặt với cùng một vấn đề và sau đó tôi đã phát hiện ra giải pháp sau đây.

Đảm bảo Bạn đã nhập tất cả các thông tin đăng nhập sau vào tệp database.yml và chúng chính xác:

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

Tôi đã gặp sự cố này sau khi xóa bảng người dùng. các giải pháp đã thay đổi

change_table(:users)

đến

create_table(:users)

3

::Migration[5.0]đã mất tích trong các cuộc di cư. thay vì ném lỗi cú pháp, nó ném

PG :: UndefinedTable: LỖI: vai trò quan hệ không tồn tại

sau khi lãng phí hàng giờ, tôi cuối cùng đã phát hiện ra rằng quá trình di chuyển bị thiếu ::Migration[5.0].

Di chuyển sai:

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

Di chuyển cố định và đúng

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

Đây có thể là một lỗi với đường ray và có thể giúp ai đó, thay vì vật lộn và băn khoăn.


Đúng!!! Tôi không nghĩ đó là một lỗi mặc dù nó là một vấn đề phổ biến đối với rails 5. Tôi nghĩ rằng rails đã cố tình làm điều này Kế thừa trực tiếp từ ActiveRecord.
Cộng đồng

2

Tôi đã gặp lỗi tương tự khi cố gắng chạy thử nghiệm bằng rspec.

Tôi đã làm theo các bước của Малъ Скрылевъ nhưng cuối cùng vẫn thiếu. Bước cuối cùng tôi cần làm là tải lược đồ của tôi vào cơ sở dữ liệu thử nghiệm của tôi bằng cách sử dụng:

RAILS_ENV=test rake db:schema:load

Sau đó, sự cố đã biến mất và tôi có thể chuyển sang lỗi tiếp theo. Hy vọng rằng điều đó cung cấp cho bạn một số cái nhìn sâu sắc.



2

(Tôi biết điều này đã cũ, nhưng dành cho những người dùng google trong tương lai)

Bạn đang sử dụng devise? Tôi biết cụ thể omniauthablelà một vấn đề, nhưng có lẽ những người khác cũng vậy. Nó không nhất thiết phải như devisevậy. Nói chung, giải pháp là nhận xét mô hình vi phạm, lớp học, bất cứ điều gì và bỏ nhận xét bất kỳ phần nào mà lỗi yêu cầu.

Đối với tôi, điều đang xảy ra là deviseđọc Usermô hình để xem những gì bạn có làm đối số devise(tức là phương thức lớp devise :database_authenticatable, :registerable #etc)

Tuy nhiên, nó sẽ đọc toàn bộ tệp và nếu đây không phải là một dự án mới, nó có thể bị vấp bởi các phương thức lớp khác dựa vào những thứ khác (trong trường hợp của tôi, đó là friendly_idgem, và sau đó là mộtalias_method

Câu trả lời là nhận xét Usermô hình ngoại trừ devise(các) dòng * và rake db:schema:loadsẽ chạy tốt.

  • nếu không thì tôi gặp lỗi này:

    ArgumentError: Ánh xạ omniauth_callbacks trên một tài nguyên không phải là toàn bộ Vui lòng thêm devise :omniauthablevào Usermô hình


2

Nếu bạn gặp lỗi này khi di chuyển, hãy đảm bảo rằng tên kiểu máy của bạn là số nhiều

ví dụ.

add_column :images, :url, :string

1

Nguyên nhân có thể xảy ra nhất là rake của bạn đang sử dụng môi trường từ database.yml khác với máy chủ web của bạn.


Xin chào, làm thế nào đây là điều mà tôi có thể chắc chắn? có lệnh nào tôi có thể đặt trong thiết bị đầu cuối không?
Naomi K

và bạn đang khởi động máy chủ web của mình như thế nào?
techvineet

Tôi chỉ chạy cục bộ ngay bây giờ sử dụng đường ray s tại nhà ga
Naomi K

1

Tôi đã gặp sự cố này và hóa ra là do API Grape . Tôi nhận thấy trong dấu vết ngăn xếp rằng tệp tuyến đường đang được đọc trong quá trình di chuyển.

Trong route.rb, api Grape được gắn

mount API::Base => '/'

Và trong API là các tham chiếu đến mô hình bị thiếu. Vì vậy, nhờ câu trả lời này, tôi đã đặt nó vào một khối phát hiện xem nó đang được chạy bởi máy chủ hay trong quá trình di chuyển.

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

Va no đa hoạt động.


1

Tôi đã gặp lỗi sau và thực hiện tra cứu tất cả mã ứng dụng của type_zonesmình, tôi không thể tìm thấy nó. Tôi cũng đã nhìn vào db và nó đã được cập nhật.

Hóa ra đó là một tệp nằm dưới đồ đạc /test/fixtures/type_zones.ymlđã gây ra sự cố.

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

Đối với bất kỳ ai vẫn gặp sự cố này, trong trường hợp của tôi, đó là nhà máy của tôi trong FactoryGirl đã gây ra lỗi này.

Tôi đã cố gắng thêm tham chiếu qua '.new' hoặc '.create'.


0

Trong trường hợp của tôi, tôi đã phải nhận xét ra 2 ActiveAdmin tệp. Đây là các bước của tôi:

  1. Lỗi ban đầu / stacktrace (lưu ý rằng chúng tôi đang sử dụng Solrtrong dự án này): ⇒ 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)

Tôi đã nhận xét app/admin/discussions.rbtệp theo câu trả lời của Arcolye ở trên và cố gắng di chuyển lại cơ sở dữ liệu của mình.

Cùng một lỗi.

Tôi đã xem xét stacktrace kỹ hơn một chút và nhận thấy rằng trên thực tế app/admin/users.rb:25đang ném ngoại lệ - và chắc chắn, tệp đó có phụ thuộc vào discussionsbảng của tôi (thông qua việc thực thi Discussion.all).

Cuối cùng, nhận xét về nội dung của users.rbcho phép tôi cuối cùng đã di chuyển cơ sở dữ liệu của mình thành công.

FYI: có một cuộc thảo luận ở đây trong ActiveAdminkhoảng liệu đá quý mà nên tải cơ sở dữ liệu khi cần thiết.



0

Tôi đã gặp lỗi:

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

Nó hóa ra là một sửa chữa siêu dễ dàng. Tôi đã sao chép các tệp từ phiên bản cũ hơn của dự án và quên lồng chúng vào bên trong thư mục "di cư". Khi tôi làm điều đó, nó đã giải quyết được vấn đề cho tôi.


0

nó thường có thể xảy ra khi bạn sử dụng sai kiểu liên kết giữa các mô hình, hãy kiểm tra kết hợp hủy phụ thuộc và has_many, ví dụ:

sai cách có thể gây ra sự cố này:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

has_and_belongs_to_many :articles

đúng cách:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.