ruby-on-rails - rails - ruby heroku
Obteniendo "Clave primaria desconocida para la tabla" mientras la ID está allí (8)
He estado depurando este problema de Rails al darme "Clave primaria desconocida para la tabla ...", incluso cuando la ID de la tabla está allí.
Copié la base de datos de una aplicación heroku a otra, en el databse original no hay problema y la nueva me da un error db.
Este es el error:
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''
La línea que lo causa:
product.collections.last.try :user
y la mesa:
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)
¿Alguna idea de por qué esto podría pasar?
¡Gracias!
Estaba restaurando el volcado de la base de datos de heroku a mi sistema local y estaba obteniendo este error.
ActiveRecord::UnknownPrimaryKey: ActiveRecord::UnknownPrimaryKey
Estaba restaurando en una base de datos existente, así que dejé la base de datos, creé una nueva base de datos y luego restablecí el volcado y funcionó para mí
Estaba teniendo este problema y el problema resultó ser que mi tabla de alguna manera en realidad no tenía un índice de clave principal. La solución fue crear una migración que agregara una clave principal:
execute "ALTER TABLE appointment_reminder_text ADD PRIMARY KEY (id)"
Estaba teniendo un problema similar y esta era la única página que podía encontrar. Entonces, en caso de que sea de ayuda para alguien más ...
Comencé de repente a perder mensajes de clave primaria en un par de tablas. Supongo, pero no estoy seguro, que esto comenzó a suceder después de presionar los datos (pg_dump local, heroku pg:restore
)
Las claves principales en cuestión estaban en tablas que habían sido renombradas para que el nombre pkey no coincidiera con el nombre de la tabla, pero por otro lado muchas otras tablas renombradas estaban en el mismo barco y no tenían problemas.
De todos modos, en un momento de mi agitación traté de subir otro archivo de volcado y noté algunas quejas sobre los índices ofensivos. Primero trataría de eliminarlos y quejarse de que no podría porque no existían. Más tarde trataría de crearlos y se quejaría de que no podría porque ya existían.
Muy molesto teniendo en cuenta que la información de pkey no aparece en schema.rb
y se supone que ''solo funciona'', ¿verdad?
De todos modos, lo que funcionó para mí (y por lo tanto la razón por la que estoy publicando) es hacer un heroku pg:reset
y luego cargar el volcado de nuevo. Nota al heroku pg:reset
, obtuve ''error interno del servidor'' las primeras dos veces que intenté heroku pg:reset
. Pero luego lo intenté de nuevo y funcionó.
Gracias cambiar el índice anterior funcionó para mí. Solo otra nota rápida sobre cómo se manifestará este error si hay una relación más compleja involucrada:
ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: ...CT "users".* FROM "users" WHERE "benefits"."" IN (''1''...
Hace poco me encontré con este error: "Clave primaria desconocida para la tabla", y como el que pregunta, apareció después de copiar una base de datos a una aplicación Heroku.
La base de datos de origen no tenía ningún error, así que estaba seguro de que la tabla y la clave principal estaban bien.
heroku pg:reset
algunos consejos en esta página, incluyendo comenzar desde cero con un heroku pg:reset
, nuevo pg_dump
de la base de datos anterior, y pgbackups:restore
en la nueva base de datos, luego ejecutar migraciones y sembrar ... nada funcionó.
Lo que finalmente resolvió mi problema fue simple: reiniciar la aplicación. La nueva aplicación tenía muchas migraciones de bases de datos, y la ejecución de heroku restart
recargó el esquema y recogió los cambios del esquema. Esta página de la documentación de Heroku explica:
Después de ejecutar una migración, deberá reiniciar su aplicación con heroku restart para volver a cargar el esquema y recuperar los cambios de esquema.
Lo que me ayudó (sucedió en heroku después de una restauración de db) es reindexar el índice de clave principal:
reindex index $primary_key_index_name
Parece que falta la clave principal para las colecciones de tablas.
Antes de Rails 3.2 , configure la clave principal en un modelo como
class Collection < ActiveRecord::Base
set_primary_key "my_existing_column"
end
En Rails 3.2+ y Rails 4 , configure la clave principal en un modelo como
class Collection < ActiveRecord::Base
self.primary_key = "my_existing_column"
end
O
Podemos alterar la tabla y establecer la clave principal para id como
Crea un archivo de migración para configurar la clave principal
class AddPrimaryKeyToCollections < ActiveRecord::Migration
def change
execute "ALTER TABLE collections ADD PRIMARY KEY (id);"
end
end
Si intenta solucionar este problema, asegúrese de verificar sus registros con cuidado. Noté un error anterior relacionado con un activo js que no se estaba precompilando. Esto se perdió en la pila de mensajes de representación.
Una vez que arreglé el problema de precompilación de activos, ya no se lanzó el error ''Clave primaria desconocida para la tabla''.
Esto fue 100% definitivamente lo único que cambié.