Je l'ai utilisé réponse de cette question:Django: problème avec RawQuerySet passant params plusieurs
Django: making raw SQL query, passing multiple/repeated params?
mais ont quelques problèmes.
J'ai params:
params = {'film_id_string': 'core_film.parent_id', 'tags_params': 'comedy', 'order_by': 'core_film.title', 'content_type': '18', 'language_code': 'en'}
pour requête SQL:
query = 'SELECT DISTINCT "core_object".*, "core_film".* FROM "core_film" INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id") LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %(film_id_string)s) LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id") LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id") WHERE "tagging_tag"."name" IN (%(tags_params)s) AND "core_objectlocalized"."LANG"=%(language_code)s AND content_type_id=%(content_type)s ORDER BY %(order_by)s'
Quand j'ai essayé d'utiliser RawQuerySet
films = Film.objects.raw(query, params)
Je reçois:
SELECT DISTINCT "core_object".*, "core_film".*
FROM "core_film"
INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id")
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\')
LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id")
LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id")
WHERE "tagging_tag"."name" IN (E\'comedy\')
AND "core_objectlocalized"."LANG"=E\'en\'
AND content_type_id=E\'18\'
ORDER BY E\'core_film.title\'
Le problème est que chaque lieu avec 'E\'
générer une erreur semblable à ceci:
DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...
Comment puis-je résoudre ce problème?
Version Django 1.2.3.
modifier
Je ne peux pas supprimer les citations, parce que je travaille avec la chaîne:
result = self.function(result, tag, "core_film.parent_id")
def function(self, objects, tags, film_id_string):
Mes params pour RawQuerySet ressemblent à ceci:
params = {'film_id_string': film_id_string}
Lorsque je tente d'analyser cette Je reçois:
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\')
et j'ai des problèmes avec
DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...
mais, quand j'utilise le formatage de chaîne
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %s)' % film_id_string
cela fonctionne:
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = core_film.parent_id)
Je veux ommettre posibility d'injection SQL, donc basant sur Django docs Je ne veux pas passer les paramètres avec le formatage de chaîne.
Que puis-je faire d'autre?
Essayez de supprimer les apostrophes des valeurs dans le dictionnaire. C'est comme ça dans le vieux post plus ancien, et il semble que la base de données essaye de leur échapper ce qui est la cause du E \ ... \. – solartic
@solartic, merci pour la suggestion.Partiellement j'ai enlevé des citations, mais le problème existe toujours. J'ai également ajouté des informations supplémentaires à ma question. –
@dasm Honnêtement, cette information supplémentaire me déroute, mais de toute façon l'erreur me dit qu'une valeur entière est attendue pour "core_objectlocalized". "Parent_id", et vous passez une chaîne? Dans votre dernier bloc de code, vous l'utilisez comme une variable et non comme une piqûre qui fonctionne pour vous. – solartic