sql >> データベース >  >> RDS >> PostgreSQL

Rails 5がスキーマファイルにnextvalメソッドを追加するのはなぜですか?

    これは少し長い答えなので、いくつかのセクションに分けました。バックルアップ!

    私の理論

    私の推測では、開発データベースは 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列に適切なデフォルトがあることを信頼し、実際に表示された値を無視していた可能性があります。しかし、それが本当かどうかを確認するための調査は行っていません。



    1. SQL インと交差

    2. Oracle ORA-01008:すべての変数がパラメータ付きのエラーにバインドされているわけではありません

    3. Oracle SQLのスキーマ内のすべてのテーブルを一覧表示するにはどうすればよいですか?

    4. MySQL複数テーブル結合クエリのパフォーマンスの問題