heroku, postgreSQL, django, commentaires, tastypie: Aucun opérateur correspond au nom donné et le type d'argument(s). Vous pourriez avoir besoin d'ajouter de type explicite jette
J'ai une requête simple sur de django reinhardt, construit dans les commentaires de modèle et d'obtenir l'erreur ci-dessous avec heroku est une base de données postgreSQL:
DatabaseError: operator does not exist: integer = text LINE 1:
... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_...
^
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.
Après googler autour il semble que cette erreur a été abordée de nombreuses fois dans django, mais je suis encore en train (toutes les questions connexes ont été fermés 3-5 ans) . Je suis à l'aide de django version 1.4 et la dernière version de tastypie.
La requête est faite en vertu de l'orm filtres et fonctionne parfaitement avec ma base de données de développement (sqlite3):
class MyResource(ModelResource):
comments = fields.ToManyField('my.api.api.CmntResource', 'comments', full=True, null=True)
def build_filters(self, filters=None):
if filters is None:
filters = {}
orm_filters = super(MyResource, self).build_filters(filters)
if 'cmnts' in filters:
orm_filters['comments__user__id__exact'] = filters['cmnts']
class CmntResource(ModelResource):
user = fields.ToOneField('my.api.api.UserResource', 'user', full=True)
site_id = fields.CharField(attribute = 'site_id')
content_object = GenericForeignKeyField({
My: MyResource,
}, 'content_object')
username = fields.CharField(attribute = 'user__username', null=True)
user_id = fields.CharField(attribute = 'user__id', null=True)
Quelqu'un a une expérience avec l'erreur sans avoir à écrire de SQL brut?
Comme le message d'erreur indique que vous êtes en train de comparer un nombre entier d'une valeur de texte. Arrêter de le faire et l'erreur s'en aller.
D'ailleurs, c'est un bon exemple de pourquoi les essais doivent être effectués avec un environnement aussi proche que possible de l'endroit où vous déployez: cependant beaucoup de un cadre de revendications à l'abstrait sur elle, quelque chose d'aussi complexe qu'un SGBD est lié à avoir des comportements différents et des limites.
IMSoP, oui en effet j'ai appris cette leçon d'aujourd'hui! Viens de changer mon développement DB par rapport à PostgreSQL de travailler sur cette question.
Wow, plus de 2900 points de vue et non pas un vote... je suppose que 2900 personnes ont trouvé cette question inutile.
5243 et de comptage....
D'ailleurs, c'est un bon exemple de pourquoi les essais doivent être effectués avec un environnement aussi proche que possible de l'endroit où vous déployez: cependant beaucoup de un cadre de revendications à l'abstrait sur elle, quelque chose d'aussi complexe qu'un SGBD est lié à avoir des comportements différents et des limites.
IMSoP, oui en effet j'ai appris cette leçon d'aujourd'hui! Viens de changer mon développement DB par rapport à PostgreSQL de travailler sur cette question.
Wow, plus de 2900 points de vue et non pas un vote... je suppose que 2900 personnes ont trouvé cette question inutile.
5243 et de comptage....
OriginalL'auteur arctelix | 2013-04-16
Vous devez vous connecter pour publier un commentaire.
PostgreSQL est "fortement typé" - qui est, pour chaque valeur de la requête a un type particulier, que ce soit définie de manière explicite (par exemple, le type d'une colonne dans une table) ou implicitement (par exemple, les valeurs d'entrée dans un
WHERE
clause). Toutes les fonctions et les opérateurs, y compris=
, être définie comme l'acceptation des types spécifiques - ainsi, par exemple, il existe un opérateur pourVarChar = VarChar
, et une autre pourint = int
.Dans votre cas, vous avez une colonne qui est explicitement définie comme étant de type
int
, mais vous êtes de le comparer à une valeur qui PostgreSQL a interprété comme typetext
.SQLite, d'autre part, est "faiblement typé" - les valeurs sont librement traitées comme étant quel que soit le type le mieux adapté à l'action en cours d'exécution. Donc, dans votre dev de base de données SQLite l'opération
'42' = 42
peut être calculée très bien, où PostgreSQL aurait besoin d'une définition spécifique de laVarChar = int
(outext = int
,text
être le type de la surabondance de chaînes dans PostgreSQL).Maintenant, PostgreSQL parfois être utile et automatiquement "cast" de vos valeurs pour les types correspondent connu de l'opérateur, mais le plus souvent, comme le soupçon dit, vous avez besoin de le faire explicitement. Si vous avez écrit le SQL vous-même, un type explicite cas pourrait ressembler à
WHERE id = CAST('42' AS INT)
(ouWHERE CAST(id AS text) = '42'
).Puisque vous ne l'êtes pas, vous devez vous assurer que l'entrée du générateur de requêtes est un entier, et pas seulement une chaîne de caractères qui se passe composé de chiffres. Je suppose que c'est aussi simple que d'utiliser
fields.IntegerField
plutôt quefields.CharField
, mais je ne sais pas vraiment Django, ou encore Python, j'ai donc pensé que je voudrais vous donner l'arrière-plan, dans l'espoir que vous pouvez prendre à partir de là.OriginalL'auteur IMSoP
Bâtiment sur IMSoP réponse: C'est une limitation de l'ORM de django couche quand un Générique de clé étrangère utilise un champ de texte pour le object_id et l'objet du champ id n'est pas un champ de texte. Django ne veut pas faire d'hypothèses ou de jeter l'identifiant d'objet comme quelque chose qu'il ne l'est pas. J'ai trouvé un excellent article sur ce http://charlesleifer.com/blog/working-around-django-s-orm-to-do-interesting-things-with-gfks/.
L'auteur de l'article, Charles Leifer est venu avec un très cool solution pour les requêtes qui sont touchés par cela, et sera très utile dans le traitement de cette question aller de l'avant.
Sinon, j'ai réussi à obtenir ma requête fonctionne comme suit:
À l'origine, je cherchais un moyen de modifier le SQL similaire à ce que Charles a fait, mais il s'avère que tout ce que j'avais à faire était de saut de la requête en deux parties et convertir les str(id)'s pour int(id).
OriginalL'auteur arctelix
À ne pas pirater vous ORM et externes, logiciel de postgres vous permettent d'enregistrer votre propre jette et les opérations de comparaison. S'il vous plaît regardez l'exemple en question similaire.
OriginalL'auteur Hubbitus