PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao rails 5 lại thêm phương thức nextval trong tệp lược đồ?

Đây là một câu trả lời hơi dài, vì vậy tôi đã chia nó thành nhiều phần. Thắt dây an toàn!

Lý thuyết của tôi

Tôi đoán là cơ sở dữ liệu phát triển của bạn không chứa lessons_id_seq trình tự và định nghĩa của nó về flightlessons.id được đặt để phụ thuộc vào nó (tức là chính xác những gì Rails đang đưa vào tệp lược đồ của bạn).

Như thế nào và tại sao? Bạn có thể đã đổi tên lessons bảng tới flightlessons tại một thời điểm nào đó trong quá khứ, nhưng việc đổi tên đó không thay đổi trình tự mà bảng phụ thuộc vào - và kể từ schema.rb không ghi lại các chuỗi, lessons_id_seq trình tự không được sao chép vào cơ sở dữ liệu thử nghiệm của bạn và do đó bạn gặp lỗi này.

Để xác minh lý thuyết của tôi, hãy chạy rails db và thử các lệnh sau:

\d lessons_id_seq

Điều này sẽ trả về định nghĩa của chuỗi đó. Sau đó, hãy thử:

\d flightlessons

Và nhìn vào định nghĩa của id cột. Tôi hy vọng nó sẽ bao gồm DEFAULT nextval('lessons_id_seq') .

Bản sửa lỗi

Cách dễ nhất để khắc phục điều này là chuyển sang sử dụng structure.sql thay vì schema.rb (xem tài liệu ). Điều này sẽ chuyển trạng thái chính xác của cơ sở dữ liệu của bạn và tránh bất kỳ sự can thiệp hoặc giải thích nào của Rails, đó là nguyên nhân gây ra sự cố hiện tại của bạn. Tôi luôn khuyên bạn nên sử dụng structure.sql cho hệ thống sản xuất.

Tuy nhiên, bạn cũng có thể vào cơ sở dữ liệu phát triển của mình và thay đổi tên trình tự:

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

Đây sẽ là một ý tưởng tồi trên hệ thống sản xuất, nhưng nếu sự cố của bạn chỉ là cục bộ, nó sẽ sửa lại trạng thái cơ sở dữ liệu hiện tại của bạn bằng schema.rb và do đó giải quyết vấn đề hiện tại của bạn. Bạn có thể muốn mã hóa nó thành một quá trình di chuyển, nếu bạn muốn rails db:drop db:create db:migrate để làm việc trên một ứng dụng mới.

Tại sao lại là bây giờ?

Hành vi mà Rails đang giải phóng default giá trị cho khóa chính của bảng của bạn rất có thể là mới trong Rails 5. Trước đây, Rails có thể đã tin tưởng rằng cột ID của bạn có một mặc định lành mạnh và bỏ qua bất kỳ giá trị nào mà nó thực sự thấy. Nhưng tôi chưa thực hiện nghiên cứu để xem điều đó có đúng hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối Pyspark với cơ sở dữ liệu Postgres trong máy tính xách tay ipython

  2. tạo phần mở rộng pg_cron trong docker-entrypoint-initdb.d không thành công

  3. Làm thế nào để bao gồm các hàng bị loại trừ trong QUAY LẠI khỏi CHÈN ... BẬT MÂU THUẪN

  4. Làm cách nào để NHÓM THEO ngày với trường dấu thời gian trong Postgres?

  5. Làm cách nào để thêm khóa vào giá trị mảng JSON?