PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengapa Rails 5 menambahkan metode nextval dalam file skema?

Ini jawaban yang agak panjang, jadi saya membaginya menjadi beberapa bagian. Gesper!

Teori saya

Dugaan saya adalah bahwa basis data pengembangan Anda tidak berisi lessons_id_seq urutan, dan bahwa definisi flightlessons.id diatur untuk bergantung padanya (yaitu, persis apa yang dimasukkan Rails ke dalam file skema Anda).

Bagaimana dan mengapa? Anda mungkin mengganti nama lessons tabel ke flightlessons di beberapa titik di masa lalu, tetapi penggantian nama itu tidak mengubah urutan tempat tabel bergantung -- dan sejak schema.rb apakah tidak merekam urutan, lessons_id_seq sequence tidak disalin ke database pengujian Anda, dan dengan demikian Anda mendapatkan kesalahan ini.

Untuk memverifikasi teori saya, jalankan rails db dan coba perintah berikut:

\d lessons_id_seq

Ini harus mengembalikan definisi urutan itu. Kemudian, coba:

\d flightlessons

Dan lihat definisi id kolom. Saya berharap untuk menyertakan DEFAULT nextval('lessons_id_seq') .

Perbaikan

Cara termudah untuk memperbaikinya adalah dengan beralih menggunakan structure.sql bukannya schema.rb (lihat dokumen ). Ini akan membawa status yang tepat dari database Anda dan menghindari gangguan atau interpretasi apa pun oleh Rails, yang menyebabkan masalah Anda saat ini. Saya selalu merekomendasikan structure.sql untuk sistem produksi.

Namun, Anda juga dapat masuk ke database pengembangan dan mengubah nama urutan:

ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');

Ini akan menjadi ide yang buruk pada sistem produksi, tetapi jika masalah Anda hanya lokal, itu akan memperbaiki status database Anda saat ini dengan schema.rb Anda dan dengan demikian mengatasi masalah Anda saat ini. Anda mungkin ingin menyandikannya ke dalam migrasi, jika Anda ingin rails db:drop db:create db:migrate untuk mengerjakan aplikasi baru.

Kenapa sekarang?

Perilaku di mana Rails membuang default nilai untuk kunci utama tabel Anda mungkin sangat baru di Rails 5. Sebelumnya, Rails mungkin baru saja mempercayai bahwa kolom ID Anda memiliki default yang waras, dan mengabaikan nilai apa pun yang sebenarnya dilihatnya. Tapi saya belum melakukan penelitian untuk melihat apakah itu benar atau tidak.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql, pilih bidang kosong

  2. Kata sandi default untuk pengguna saya di postgresql

  3. Bagaimana cara mengubah struktur data jsonb yang disimpan di Postgres

  4. Pemicu umum untuk membatasi penyisipan berdasarkan jumlah

  5. Kesalahan saat menjalankan migrasi:sqlalchemy.exc.CompileError:Jenis ENUM Postgresql memerlukan nama