これは少し長い答えなので、いくつかのセクションに分けました。バックルアップ!
私の理論
私の推測では、開発データベースは lessons_id_seq
が含まれています シーケンス、およびそのflightlessons.id
の定義 それに依存するように設定されています(つまり、Railsがスキーマファイルに何を入れているか)。
方法と理由? lessons
の名前を変更した可能性があります flightlessons
へのテーブル 過去のある時点で、その名前変更はテーブルが依存していたシーケンスを変更しませんでした-そしてschema.rb
以降 しません レコードシーケンス、lessons_id_seq
シーケンスはテストデータベースにコピーされないため、このエラーが発生します。
私の理論を検証するには、rails db
を実行します 次のコマンドを試してください:
\d lessons_id_seq
これにより、そのシーケンスの定義が返されます。次に、試してください:
\d flightlessons
そして、id
の定義を見てください 桁。 DEFAULT nextval('lessons_id_seq')
が含まれていると思います 。
修正
これを修正する最も簡単な方法は、structure.sql
の使用に切り替えることです。 schema.rb
の代わりに (ドキュメント
を参照してください。 )。これにより、データベースの正確な状態が引き継がれ、現在の問題の原因となっているRailsによる干渉や解釈が回避されます。私は常にstructure.sql
をお勧めします 実動システム用。
ただし、開発データベースにアクセスしてシーケンス名を変更することもできます:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
これは本番システムではひどい考えですが、問題がローカルだけの場合は、schema.rb
を使用して現在のデータベースの状態を修正する必要があります。 したがって、現在の問題に対処します。 rails db:drop db:create db:migrate
が必要な場合は、これを移行にエンコードすることをお勧めします。 新しいアプリで作業する。
なぜ今なのか
Railsがdefault
をダンプしている動作 テーブルの主キーの値は、Rails 5では非常に新しい可能性があります。以前は、Railsは、ID列に適切なデフォルトがあることを信頼し、実際に表示された値を無視していた可能性があります。しかし、それが本当かどうかを確認するための調査は行っていません。