27

Tôi đã gỡ lỗi sự cố trang này của Rails cho tôi "Khóa chính không xác định cho bảng ...", ngay cả khi ID của bảng ở đó.Lấy "Khóa chính không xác định cho bảng" trong khi ID có ở đó

Tôi đã sao chép cơ sở dữ liệu từ một ứng dụng heroku sang một ứng dụng khác, trên dữ liệu gốc không có vấn đề gì và cái mới cho tôi lỗi db.

Đây là lỗi:

ProductsController# (ActionView::Template::Error) "Unknown primary key for table collections in model Collection." 

/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/reflection.rb:366:in `primary_key' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/reflection.rb:480:in `association_primary_key' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:58:in `block in add_constraints' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `each' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `each_with_index' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:39:in `add_constraints' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association_scope.rb:31:in `scope' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:98:in `association_scope' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/association.rb:87:in `scoped' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:573:in `first_or_last' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_association.rb:105:in `last' 
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/collection_proxy.rb:46:in `last' 
/app/app/helpers/likes_helper.rb:62:in `significant_liker' 

Dòng gây ra nó:

product.collections.last.try :user 

và bảng:

d8apjspa441pad=> \d collections 
            Table "public.collections" 
    Column  |   Type   |      Modifiers       
----------------+------------------------+---------------------------------------------------------- 
id    | integer    | not null default nextval('collections_id_seq'::regclass) 
name   | character varying(255) | 
user_id  | integer    | 
permalink  | character varying(255) | 
category_id | integer    | 
products_count | integer    | 
is_featured | boolean    | 
Indexes: 
    "index_lists_on_user_id_and_permalink" UNIQUE, btree (user_id, permalink) 

Bất cứ ý tưởng tại sao điều này có thể xảy ra?

Cảm ơn!

+0

Có vẻ như chỉ số khóa chính bị thiếu trong bộ sưu tập. – Debadatt

+0

Bạn có thể chia sẻ lợi ích của tôi và của người khác cách thiết lập nó trong câu trả lời không? – hakunin

Trả lời

25

Dường như khóa chính bị thiếu cho các bộ sưu tập bảng.

Trước Rails 3.2, thiết lập khóa chính trong mô hình như

class Collection < ActiveRecord::Base 
    set_primary_key "my_existing_column" 
end 

Trong Rails 3.2+ và Rails 4, thiết lập khóa chính trong mô hình như

class Collection < ActiveRecord::Base 
    self.primary_key = "my_existing_column" 
end 

HOẶC

Chúng tôi có thể thay đổi bảng d thiết lập khóa chính cho id như

Tạo một tập tin chuyển đổi sang thiết lập các khóa chính

class AddPrimaryKeyToCollections < ActiveRecord::Migration 
def change 
    execute "ALTER TABLE collections ADD PRIMARY KEY (id);" 
end 
end 
+0

Hmm, tôi nghĩ bạn có nghĩa là thiết lập khóa chính trong DB, đó là những gì tôi đã làm và mặc dù nó phàn nàn về khóa đang được thiết lập, ứng dụng bắt đầu hoạt động. Bạn có thể giải thích lý do tại sao tôi sử dụng 'set_primary_key' ngay cả khi ID chỉ là' id' mặc định? Có thể có ích. – hakunin

+0

Bảngbộ sưu tập của bạn có thể bỏ qua một chỉ mục khóa chính trong db. Mỗi bảng phải có khóa chính. Vì bảng ở đây thua khóa chính, chúng ta cần thiết lập nó. Nhưng id mặc định không thể thiết lập làm khóa chính ..do đó, nó làm tăng ngoại lệ. – Debadatt

+0

Vì vậy, basicaly, tôi đã có hai lựa chọn - một cách rõ ràng cho Rails, hoặc thiết lập các thuộc tính DB một cách chính xác, phải không? Nếu bạn thêm PSQL để thiết lập thuộc tính, tôi sẽ chấp nhận câu trả lời của bạn. – hakunin

13

Tôi đã có một vấn đề tương tự và đây là trang duy nhất tôi có thể tìm thấy. Vì vậy, chỉ trong trường hợp nó sẽ giúp đỡ cho bất kỳ ai khác ...

Tôi bắt đầu đột nhiên nhận được thông báo khóa chính thiếu trên một vài bảng. Tôi đoán, nhưng không chắc chắn, điều này bắt đầu xảy ra sau khi đẩy dữ liệu (pg_dump local, heroku pg:restore)

Các khóa chính được đề cập đều trên bảng đã đổi tên sao cho tên pkey không khớp với tên bảng - nhưng rất nhiều bàn được đổi tên khác nằm trong cùng một chiếc thuyền và không có vấn đề gì.

Dù sao, tại một thời điểm trong khoảng trống của tôi xung quanh tôi đã thử tải lên tệp kết xuất khác và tôi nhận thấy một số khiếu nại về các chỉ mục vi phạm. Đầu tiên nó sẽ cố gắng xóa chúng và phàn nàn rằng nó không thể vì chúng không tồn tại. Sau đó nó sẽ cố gắng tạo ra chúng và phàn nàn rằng nó không thể vì chúng đã tồn tại.

Rất khó chịu khi xem xét thông tin pkey không hiển thị trong schema.rb và được cho là 'chỉ hoạt động', đúng không?

Dù sao, những gì đã hiệu quả đối với tôi (và do đó lý do tôi đăng) là thực hiện heroku pg:reset và sau đó tải lại lần nữa. Bên lưu ý, tôi đã nhận 'lỗi máy chủ nội bộ' hai lần đầu tiên tôi đã thử heroku pg:reset. Nhưng sau đó tôi đã thử lại và nó đã hoạt động.

0

Nếu bạn đang cố khắc phục sự cố này, hãy đảm bảo bạn kiểm tra cẩn thận nhật ký của mình. Tôi nhận thấy một lỗi trước đó liên quan đến một tài sản js không được biên dịch trước. Điều này đã bị mất trong ngăn xếp tin nhắn hiển thị.

Khi tôi đã khắc phục vấn đề biên dịch tài sản, lỗi 'Khóa chính không xác định cho bảng' không còn bị ném nữa.

Điều này chắc chắn là điều duy nhất tôi thay đổi 100%.

5

Gần đây tôi đã gặp lỗi này: "Khóa chính không xác định cho bảng" và giống như người hỏi câu hỏi, nó xuất hiện sau khi sao chép cơ sở dữ liệu vào ứng dụng Heroku.

Cơ sở dữ liệu nguồn không có lỗi, vì vậy tôi tự tin rằng bảng và khóa chính vẫn ổn.

Tôi đã thử một vài lời khuyên trên trang này, kể cả bắt đầu từ đầu với một heroku pg:reset, mới pg_dump của cơ sở dữ liệu cũ, và pgbackups:restore vào cơ sở dữ liệu mới, sau đó chạy di cư và hạt giống ... không có gì làm việc.

Điều cuối cùng đã giải quyết được vấn đề của tôi rất đơn giản: khởi động lại ứng dụng. Ứng dụng mới có nhiều lần di chuyển cơ sở dữ liệu và chạy heroku restart tải lại giản đồ và chọn các thay đổi lược đồ. Trang này từ tài liệu Heroku của giải thích:

Running Rake Commands

Sau khi chạy một di chuyển bạn sẽ muốn khởi động lại ứng dụng của bạn với Heroku khởi động lại để tải lại lược đồ và đón bất kỳ thay đổi giản đồ.

+1

Đơn giản chỉ cần khởi động lại cũng làm việc cho tôi với lỗi này sau khi triển khai capistrano. – GSP

+0

'heroku pg: reset' rồi nhập lại DB làm việc cho tôi. Tôi đã tạo thủ công một chỉ mục trên DB sản xuất và nó không được sao chép chính xác sang phân đoạn DB – Josh

2

gì đã giúp cho tôi (xảy ra trên Heroku sau một db khôi phục) được reindexing chỉ số khóa chính:

reindex index $primary_key_index_name

+0

Bạn nhập mã này vào đâu? – Swards

+0

Trong bảng điều khiển 'psql'. –

+0

Tôi đã nhận được lỗi trong sản xuất (trên Heroku) sau khi đẩy. Không chắc tôi có quyền truy cập vào bảng điều khiển db. Đẩy một lần nữa để Heroku dường như sửa chữa nó. Cám ơn đã chỉ tôi hướng đi đúng. – Swards

0

Tôi đã có vấn đề này và các vấn đề hóa ra là rằng bàn của tôi bằng cách nào đó thực sự không có chỉ mục khóa chính. Giải pháp là tạo một di chuyển đã thêm khóa chính:

execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)" 
0

Cảm ơn thay đổi chỉ mục ở trên đã hiệu quả đối với tôi. Chỉ cần một lưu ý nhanh về cách lỗi này sẽ đơm hoa nếu có một mối quan hệ phức tạp hơn liên quan đến:

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR: zero-length delimited identifier at or near """" 
LINE 1: ...CT "users".* FROM "users" WHERE "benefits"."" IN ('1'... 
1

tôi đã khôi phục lại cơ sở dữ liệu bãi từ Heroku vào hệ thống địa phương của tôi và đã nhận được lỗi này ..

ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey 

Tôi đã khôi phục cơ sở dữ liệu hiện có, vì vậy tôi đã xóa cơ sở dữ liệu, tạo cơ sở dữ liệu mới và sau đó khôi phục bãi chứa và nó hoạt động cho tôi

Các vấn đề liên quan