PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

heroku, postgreSQL, django, comments, savoureuxpie :aucun opérateur ne correspond au nom donné et au(x) type(s) d'argument(s). Vous devrez peut-être ajouter des conversions de type explicites

PostgreSQL est "fortement typé" - c'est-à-dire que chaque valeur dans chaque requête a un type particulier, défini explicitement (par exemple, le type d'une colonne dans une table) ou implicitement (par exemple, les valeurs saisies dans un WHERE clause). Toutes les fonctions et opérateurs, y compris = , doivent être définis comme acceptant des types spécifiques - ainsi, par exemple, il existe un opérateur pour VarChar = VarChar , et un différent pour int = int .

Dans votre cas, vous avez une colonne qui est explicitement définie comme type int , mais vous le comparez à une valeur que PostgreSQL a interprétée comme type text .

SQLite, d'autre part, est "faiblement typé" - les valeurs sont librement traitées comme étant du type qui convient le mieux à l'action en cours. Donc, dans votre base de données dev SQLite, l'opération '42' = 42 peut être calculé très bien, où PostgreSQL aurait besoin d'une définition spécifique de VarChar = int (ou text = int , text étant le type pour les chaînes illimitées dans PostgreSQL).

Maintenant, PostgreSQL va parfois être utile et "caster" automatiquement vos valeurs pour que les types correspondent à un opérateur connu, mais le plus souvent, comme le dit l'indice, vous devez le faire explicitement. Si vous écriviez vous-même le SQL, un cas de type explicite pourrait ressembler à WHERE id = CAST('42' AS INT) (ou WHERE CAST(id AS text) = '42' ).

Puisque ce n'est pas le cas, vous devez vous assurer que l'entrée que vous donnez au générateur de requêtes est un entier réel, et pas seulement une chaîne composée de chiffres. Je soupçonne que c'est aussi simple que d'utiliser fields.IntegerField plutôt que fields.CharField , mais je ne connais pas Django, ni même Python, alors j'ai pensé vous donner le contexte dans l'espoir que vous puissiez le reprendre à partir de là.