これは少し長い答えなので、いくつかのセクションに分けました。バックルアップ!
私の理論
私の推測では、開発データベースは 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列に適切なデフォルトがあることを信頼し、実際に表示された値を無視していた可能性があります。しかし、それが本当かどうかを確認するための調査は行っていません。