[RUBY] Operator existiert nicht: Behandlung des Fehlerzeitstempels ohne Zeitzone ~~ unbekannt

Umgebung

・ Schienen 6.0.3.2 ・ MySQL Ver 14.14 Distrib 5.6.47 ・ Osx10.15 ・ Auf Heroku bereitstellen

Zusammenfassung

Beim Erstellen einer Web-App mit Rails und beim Bereitstellen auf Heroku ist ein Fehler aufgetreten.

Beim Überprüfen des Fehlers mit dem Heroku-Protokoll habe ich die folgende Anzeige gefunden

operator does not exist: timestamp without time zone ~~ unknown

Ich habe die Fehleranweisung zuerst nicht verstanden, aber da der Zeitstempel ein Spaltentyp ist, habe ich herausgefunden, dass etwas mit dem Typ nicht stimmt, und habe ihn weiter nachgeschlagen.

Dann stellte sich heraus, dass es ein Problem mit der bedingten Anweisung der DB-Suche gab. Im Detail trat ein Problem auf, weil die Logik, die nach Datum und Uhrzeit der Datenerstellung suchte, nach einer Zeichenfolge (Zeichenfolgentyp) suchte, wie unten gezeigt.

where('created_at: LIKE(?)', "%%-%%-%%") #Der Code links ist der betreffende Code

Ursache

Die Ursache ist, dass Herokus DB "PostgreSQL" ist, was sich von meiner Umgebung (MySQL) unterscheidet. Selbst wenn Sie in "MySQL" nach einer Zeitstempeltypspalte mit einem Zeichenfolgentyp suchen, wird diese automatisch konvertiert (Vergebung). Es scheint, dass es in "PostgreSQL" nicht funktioniert, wenn die SQL-Anweisung nicht streng ist. (Streng ···)

Gegenmaßnahmen

Ich habe es mit einer Methode namens xxx.in_time_zone gelöst. Zum Beispiel in meinem Fall, wenn ich monatlich Daten sammeln und Daten für August 2020 erfassen möchte (siehe unten)

search_time = "2020-08-01"
(Modellname).where(created_at: search_time.in_time_zone.all_month)

Auf diese Weise können Sie nach Daten mit dem Zeitstempeltyp suchen, sodass dies mit "PostgreSQL" gut funktioniert hat! Auch die Beschreibung hat abgenommen und es ist erfrischend! Sie können den letzten all_month in all_day usw. ändern und es ist ziemlich brauchbar! Es gibt einen Link für Details, so dass er sehr leicht verständlich geschrieben ist!

Referenz

Über die Fehleranweisung ・ Https://nobuneko.com/blog/archives/2010/05/postgresql83operator_does_not.html Informationen zur Zeitklasse und zur DateTime-Klasse ・ Https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

Recommended Posts

Operator existiert nicht: Behandlung des Fehlerzeitstempels ohne Zeitzone ~~ unbekannt
Nach der Installation von Better_errors ändert sich der Fehlerbildschirm nicht
Über den Fehler PG :: UndefinedTable: ERROR: Die Beziehung "XXXXXX" existiert nicht
"Fehler: Paket xxx existiert nicht" "Fehler: Symbol nicht gefunden" beim Umschreiben von Kotlin