sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué Rails 5 agrega el método nextval en el archivo de esquema?

Esta es una respuesta un poco larga, así que la he dividido en secciones. ¡Abróchate el cinturón!

Mi teoría

Supongo que su base de datos de desarrollo contener el lessons_id_seq secuencia, y que su definición de flightlessons.id está configurado para depender de él (es decir, exactamente lo que Rails está poniendo en su archivo de esquema).

¿Como y por qué? Probablemente cambió el nombre de las lessons tabla a flightlessons en algún momento en el pasado, pero ese cambio de nombre no cambió la secuencia de la que dependía la tabla, y desde schema.rb no grabar secuencias, el lessons_id_seq la secuencia no se copia en su base de datos de prueba y, por lo tanto, obtiene este error.

Para verificar mi teoría, ejecuta rails db y prueba los siguientes comandos:

\d lessons_id_seq

Esto debería devolver la definición de esa secuencia. Luego, prueba:

\d flightlessons

Y mira la definición del id columna. Espero que incluya DEFAULT nextval('lessons_id_seq') .

Arreglos

La forma más fácil de solucionar esto es cambiar a usar structure.sql en lugar de schema.rb (consulte los documentos ). Esto transferirá el estado exacto de su base de datos y evitará cualquier interferencia o interpretación por parte de Rails, que es lo que está causando su problema actual. Siempre recomiendo structure.sql para sistemas de producción.

Sin embargo, también puede acceder a su base de datos de desarrollo y cambiar el nombre de la secuencia:

ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');

Esta sería una idea terrible en un sistema de producción, pero si su problema es solo local, debería rectificar el estado actual de su base de datos con su schema.rb y así abordar su problema actual. Es posible que desee codificar eso en una migración, si desea rails db:drop db:create db:migrate para trabajar en una nueva aplicación.

¿Por qué ahora?

El comportamiento en el que Rails está descargando el default El valor de la clave principal de su tabla puede muy bien ser nuevo en Rails 5. Anteriormente, es posible que Rails simplemente haya confiado en que su columna de ID tenía un valor predeterminado sensato e ignoró cualquier valor que realmente viera. Pero no he investigado para ver si eso es cierto o no.