PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que o Rails 5 está adicionando o método nextval no arquivo de esquema?


Esta é uma resposta um pouco longa, então eu a dividi em seções. Preparar-se!

Minha teoria


Meu palpite é que seu banco de dados de desenvolvimento não conter o lessons_id_seq seqüência, e que sua definição de flightlessons.id está configurado para depender dele (ou seja, exatamente o que o Rails está colocando em seu arquivo de esquema).

Como e por quê? Você provavelmente renomeou as lessons tabela para flightlessons em algum momento no passado, mas essa renomeação não alterou a sequência da qual a tabela dependia - e desde schema.rb não seqüências de registro, o lessons_id_seq sequência não é copiada para o banco de dados de teste e, portanto, você obtém esse erro.

Para verificar minha teoria, execute rails db e tente os seguintes comandos:
\d lessons_id_seq

Isso deve retornar a definição dessa sequência. Então tente:
\d flightlessons

E veja a definição do id coluna. Espero que inclua DEFAULT nextval('lessons_id_seq') .

Correções


A maneira mais fácil de corrigir isso é mudar para o uso de structure.sql em vez de schema.rb (consulte os documentos ). Isso levará o estado exato do seu banco de dados e evitará qualquer interferência ou interpretação do Rails, que é o que está causando seu problema atual. Eu sempre recomendo structure.sql para sistemas de produção.

No entanto, você também pode acessar seu banco de dados de desenvolvimento e alterar o nome da sequência:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');

Isso seria uma péssima ideia em um sistema de produção, mas se o seu problema for apenas local, ele deve corrigir o estado atual do banco de dados com seu schema.rb e, assim, resolver seu problema atual. Você pode querer codificar isso em uma migração, se quiser rails db:drop db:create db:migrate para trabalhar em um novo aplicativo.

Por que agora?


O comportamento em que o Rails está despejando o default O valor para a chave primária da sua tabela pode muito bem ser novo no Rails 5. Anteriormente, o Rails pode ter apenas confiado que sua coluna ID tinha um padrão sensato e ignorado qualquer valor que realmente visse. Mas eu não fiz a pesquisa para ver se isso é verdade ou não.