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.