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

Czy istnieje sposób na zmianę domyślnych znaczników czasu Railsów na Y-m-d H:i:s (zamiast Y-m-d H:i:s.u) lub aby laravel ignorował część dziesiętną Y-m-d H:i:s.u?

Rozwiązanie po stronie Rails

Wygląda na to, że ActiveRecord używany w Railsach (5.2) automatycznie dodaje sekundy dziesiętne do 1 ms przy zapisywaniu created_at i updated_at lub dowolne inne kolumny sygnatury czasowej w DB, które akceptują podsekundy, zgodnie z definicją w pliku active_record/connection_adapters/abstract/quoting.rb

Obejście to jest. Dodaj tę linię na najwyższym poziomie w dowolnym pliku, który byłby zawsze odczytywany przez Railsy podczas uzyskiwania dostępu do modelu (takiego jak plik modelu ApplicationRecord).

Time::DATE_FORMATS[:db] = '%Y-%m-%d %H:%M:%S.000000000'

module ActiveRecord::ConnectionAdapters::Quoting
  alias_method :quoted_date_orig, :quoted_date if ! self.method_defined?(:quoted_date_orig)

  def quoted_date(*rest, **kwd)
    quoted = quoted_date_orig(*rest, **kwd)
    quoted.sub(/(\.\d*)\.\d{6}$/, '\1')
  end
end

Możesz to potwierdzić z konsoli Rails, po utworzeniu nowego rekordu,

MyModel.last.created_at.nsec  # => 0

lub po prostu uzyskaj bezpośredni dostęp do bazy danych, aby ją zobaczyć.

Ostrzeżenie

Ta zmiana dotyczy nie tylko created_at i updated_at ale także wszystkie inne kolumny sygnatury czasowej w bazie danych. Myślę, że nadal możesz zapisać wartość do precyzji msec (lub nsec) w takiej kolumnie, ustawiając String w przeciwieństwie do instancji Time do instancji modelu, takiej jak my_model.col_msec_desired = "2018-01-02 03:04:05.678"; następnie Time::DATE_FORMATS[:db] nie zostanie przywołany podczas zapisywania rekordu.

Potencjalne rozwiązanie po stronie Laravela

Może to być trudne w momencie pisania (2018-10-18), ale wydaje się, że praca jest w toku, zgodnie z bardzo niedawny post Laracast napisany przez cmbertsch01

(Uwaga:ważna aktualizacja dokonana dzień po oryginalnym poście, po komentarzu.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz wartość kolumny poprzedniego wiersza w postgresie nie może użyć funkcji okna w UPDATE

  2. `initialize':schemat postgres nie akceptuje części rejestru:postgres:@ (lub zła nazwa hosta?) (URI::InvalidURIError) z Dockerem

  3. Dodaj ograniczenie daty i czasu do wielokolumnowego indeksu częściowego PostgreSQL

  4. W pełni zarządzany hosting PostgreSQL na platformach AWS i Azure uruchamia się na czas dla starszych migracji

  5. Jak uruchomić pliki zapytań sql za pomocą RPostgreSQL