Rails, ActiveRecord e PG :: NotNullViolation

PG::NotNullViolation: ERROR:  null value in column "id" violates not-null constraint

Se você vir este erro ao migrar um site usando ActiveRecord de MySQL para PostgreSQL, veja o que fazer a respeito.

Primeiro, lembre-se de que o ActiveRecord se configura magicamente a partir do que está sendo executado no banco de dados. É como ele descobre quais colunas são as idcolunas mágicas tão vitais para o funcionamento da maioria dos aplicativos.

Em segundo lugar, lembre-se de que o MySQL usa sequências de maneira diferente do PostgreSQL para determinar o próximo valor de um id. Quando você portou o esquema e os dados do MySQL para o PostgreSQL, essa parte da lógica não foi traduzida.

Juntando os dois pensamentos anteriores, percebemos que o que está acontecendo é que o banco de dados PostgreSQL recém-migrado não contém a lógica para autoincrementar a coluna id corretamente e , portanto , ActiveRecord não percebe que a coluna id deve ser tratada especialmente e tenta para inseri-lo como um valor nulo.

A solução é tripla:

  1. Altere as colunas de id em todas as suas tabelas para auto-incremento correto no PostgreSQL;
  2. Altere a sequência para ter o valor atual correto;
  3. Reinicie seu aplicativo para que o ActiveRecord possa recarregar.

Se precisar de mais ajuda, veja minha postagem no blog .