PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourquoi rails 5 ajoute-t-il la méthode nextval dans le fichier de schéma ?

C'est un peu long d'une réponse, donc je l'ai divisé en sections. Bouclez votre ceinture !

Ma théorie

Je suppose que votre base de données de développement fait contenir le lessons_id_seq séquence, et que sa définition de flightlessons.id est configuré pour en dépendre (c'est-à-dire exactement ce que Rails met dans votre fichier de schéma).

Comment et pourquoi? Vous avez probablement renommé les lessons tableau des flightlessons à un moment donné dans le passé, mais ce changement de nom n'a pas changé la séquence dont dépendait la table - et depuis schema.rb n'est pas enregistrer des séquences, les lessons_id_seq la séquence n'est pas copiée dans votre base de données de test et vous obtenez donc cette erreur.

Pour vérifier ma théorie, exécutez rails db et essayez les commandes suivantes :

\d lessons_id_seq

Cela devrait retourner la définition de cette séquence. Ensuite, essayez :

\d flightlessons

Et regardez la définition du id colonne. Je m'attends à ce qu'il inclue DEFAULT nextval('lessons_id_seq') .

Corrections

Le moyen le plus simple de résoudre ce problème consiste à passer à l'utilisation de structure.sql au lieu de schema.rb (voir la documentation ). Cela conservera l'état exact de votre base de données et évitera toute interférence ou interprétation par Rails, ce qui est à l'origine de votre problème actuel. Je recommande toujours structure.sql pour les systèmes de production.

Cependant, vous pouvez également accéder à votre base de données de développement et modifier le nom de la séquence :

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

Ce serait une idée terrible sur un système de production, mais si votre problème est juste local, il devrait rectifier l'état actuel de votre base de données avec votre schema.rb et ainsi résoudre votre problème actuel. Vous souhaiterez peut-être encoder cela dans une migration, si vous voulez rails db:drop db:create db:migrate pour travailler sur une nouvelle application.

Pourquoi maintenant ?

Le comportement où Rails vide le default La valeur de la clé primaire de votre table peut très bien être nouvelle dans Rails 5. Auparavant, Rails pouvait simplement croire que votre colonne ID avait une valeur par défaut saine et ignorer la valeur qu'il voyait réellement. Mais je n'ai pas fait de recherche pour voir si c'est vrai ou non.