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

Railsy 3 ignorują wyjątek unikatowego ograniczenia Postgresa

Ogólnie rzecz biorąc, obsługa wyjątków powinna znajdować się najbliżej błędu, aby można było zrobić coś sensownego z wyjątkiem. W twoim przypadku chciałbyś, aby Twój rescue wewnątrz pętli, na przykład:

stuff.each do |h|
  begin
    Model.create(h)
  rescue ActiveRecord::RecordNotUnique => e
    next if(e.message =~ /unique.*constraint.*INDEX_NAME_GOES_HERE/)
    raise
  end
end

Kilka ciekawych miejsc:

  1. Naruszenie ograniczeń w bazie danych da Ci ActiveRecord::RecordNotUnique błąd zamiast podstawowego PG::Error . AFAIK, otrzymasz PG::Error jeśli rozmawiałeś bezpośrednio z bazą danych, zamiast przechodzić przez ActiveRecord.
  2. Zastąp INDEX_NAME_GOES_HERE z prawdziwą nazwą unikalnego indeksu.
  3. Chcesz zignorować tylko oczekiwane naruszenie ograniczeń, stąd next if(...) bit, po którym następuje bezargumentowe raise (tj. ponownie zgłoś wyjątek, jeśli nie jest to to, czego oczekujesz).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najszybszy sposób skrócenia znaczników czasu do 5 minut w Postgresie?

  2. Konwertuj czas na sekundy w PostgreSQL

  3. Optymalizacja wyszukiwania pełnotekstowego Django - Postgres

  4. Wartość domyślna w kolumnie po wstawieniu nowego wiersza

  5. W Railsach, jak mogę zapytać db o zagregowaną liczbę i pogrupować według tygodnia?