[RUBY] opérateur n'existe pas: gestion de l'horodatage d'erreur sans fuseau horaire ~~ inconnu

environnement

・ Rails 6.0.3.2 ・ Mysql Ver 14.14 Distrib 5.6.47 ・ Osx10.15 ・ Déployer sur heroku

Synopsis

Une erreur s'est produite lors de la création d'une application Web avec des rails et de son déploiement sur heroku.

Lors de la vérification de l'erreur avec le journal heroku, j'ai trouvé l'affichage suivant

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

Je n'ai pas compris l'instruction d'erreur au début, mais comme l'horodatage est un type de colonne, j'ai découvert que quelque chose n'allait pas avec le type et j'ai cherché plus loin.

Ensuite, il s'est avéré qu'il y avait un problème avec l'instruction conditionnelle de la recherche de base de données. Dans un peu plus de détails, un problème est survenu car la logique qui recherchait par date et heure de création de données recherchait par une chaîne de caractères (type chaîne) comme indiqué ci-dessous.

where('created_at: LIKE(?)', "%%-%%-%%") #Le code à gauche est le code en question

Cause

La cause est que la base de données de heroku est "PostgreSQL", ce qui est différent de mon environnement (MySQL). Dans "MySQL", même si vous recherchez une colonne de type horodatage avec un type chaîne, elle sera convertie automatiquement (pardon). Il semble que cela ne fonctionnera pas dans "PostgreSQL" à moins que l'instruction SQL ne soit stricte. (Strict···)

Contre-mesures

Je l'ai résolu en utilisant une méthode appelée xxx.in_time_zone. Par exemple, dans mon cas, si je souhaite collecter des données sur une base mensuelle et que je souhaite acquérir des données pour août 2020 (ci-dessous)

search_time = "2020-08-01"
(Nom du modèle).where(created_at: search_time.in_time_zone.all_month)

Ce faisant, vous pouvez rechercher des données avec le type d'horodatage, donc cela a bien fonctionné avec "PostgreSQL"! De plus, la description a diminué et c'est rafraîchissant! Vous pouvez changer le dernier all_month en all_day etc. et c'est tout à fait utilisable! Il y a un lien pour les détails, donc il est écrit d'une manière très facile à comprendre!

référence

À propos de la déclaration d'erreur ・ Https://nobuneko.com/blog/archives/2010/05/postgresql83operator_does_not.html À propos de la classe Time et de la classe DateTime ・ Https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

Recommended Posts

opérateur n'existe pas: gestion de l'horodatage d'erreur sans fuseau horaire ~~ inconnu
Après avoir introduit Better_errors, l'écran d'erreur ne change pas
À propos de l'erreur PG :: UndefinedTable: ERROR: la relation "XXXXXX" n'existe pas
"Erreur: le package xxx n'existe pas" "Erreur: symbole introuvable" lors de la réécriture de kotlin