PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Dlaczego rails 5 dodaje metodę nextval w pliku schematu?

To trochę długa odpowiedź, więc podzieliłem ją na sekcje. Zapnij pasy!

Moja teoria

Domyślam się, że Twoja programistyczna baza danych tak zawierać lessons_id_seq i że jego definicja flightlessons.id jest ustawiony tak, aby od niego zależeć (tj. dokładnie to, co Railsy umieszczają w twoim pliku schematu).

Jak i dlaczego? Prawdopodobnie zmieniłeś nazwę lessons tabela do lessons w pewnym momencie w przeszłości, ale ta zmiana nazwy nie zmieniła kolejności, od której zależała tabela -- i odkąd schema.rb czy nie sekwencje rekordów, lessons_id_seq sekwencja nie jest kopiowana do testowej bazy danych, dlatego pojawia się ten błąd.

Aby zweryfikować moją teorię, uruchom rails db i wypróbuj następujące polecenia:

\d lessons_id_seq

Powinno to zwrócić definicję tej sekwencji. Następnie spróbuj:

\d flightlessons

I spójrz na definicję id kolumna. Oczekuję, że będzie zawierać DEFAULT nextval('lessons_id_seq') .

Poprawki

Najprostszym sposobem, aby to naprawić, jest przejście na structure.sql zamiast schema.rb (zobacz dokumentację ). Przeniesie to dokładny stan Twojej bazy danych i uniknie jakichkolwiek zakłóceń lub interpretacji przez Railsy, ​​co jest przyczyną Twojego obecnego problemu. Zawsze polecam structure.sql dla systemów produkcyjnych.

Możesz jednak również wejść do swojej bazy danych rozwoju i zmienić nazwę sekwencji:

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

To byłby okropny pomysł w systemie produkcyjnym, ale jeśli problem jest tylko lokalny, powinien poprawić aktualny stan bazy danych za pomocą schema.rb i w ten sposób rozwiązać swój obecny problem. Możesz zakodować to w migracji, jeśli chcesz rails db:drop db:create db:migrate pracować nad nową aplikacją.

Dlaczego teraz?

Zachowanie, w którym Railsy wyrzucają default wartość klucza podstawowego twojej tabeli może być całkiem nowa w Rails 5. Wcześniej Railsy mogły po prostu wierzyć, że twoja kolumna ID ma rozsądną wartość domyślną i ignorować jakąkolwiek wartość, którą faktycznie widziały. Ale nie przeprowadziłem badań, aby sprawdzić, czy to prawda, czy nie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Unikalne ograniczenie kombinacji dwóch kolumn?

  2. Jak uporządkować dane w sqlalchemy według listy

  3. Jak wstawić wartości „NULL” do bazy danych PostgreSQL za pomocą Pythona?

  4. Czy mogę używać Parallel.For z poleceniami sql?

  5. Błąd PG nie mógł połączyć się z serwerem:Połączenie odrzucone Czy serwer działa na porcie 5432?