je tente de faire une requête brute sur mesure pour un modèle et je reçois cette erreur:problèmes avec django paramètres de requête brute
DatabaseError: error de sintaxis en o cerca de «E'positions_statusrecord'» LINE 1: SELECT id FROM E'positions_statusrecord' WHERE "type"=E'Leav...
Voici la requête brute je suis en train d'utiliser (c'est une méthode de gestion):
def get_status_ids(self, model):
"""
This query returns the latest statuses ids for each entry
of "model" in StatusRecord.
"""
db_table = self.model._meta.db_table
model_type = model.get_status_type()
raw_query = (
"SELECT id "
"FROM %s "
"WHERE \"type\"=%s AND "
"(identifier,date_time) IN "
"("
"SELECT identifier, Max(date_time) "
"FROM %s "
"WHERE \"type\"=%s "
"GROUP BY identifier"
")"
)
params = (db_table, model_type, db_table, model_type,)
return self.raw(raw_query, params)
J'ai essayé avec une requête simple (juste un SELECT ... FROM ..
) et a eu le même problème. Il semble que les requêtes brutes ne puissent pas avoir la partie FROM
complétée avec un paramètre.
Ai-je raison? ou ai-je fait une erreur et je ne le trouve pas? J'utilise postgreSQL 8.4.10, django 1.3 et python 2.6.
J'ai cherché des informations sur les paramètres de requêtes brutes pour voir s'il y a des options de formatage interdites, mais je n'ai rien trouvé qui m'aide.
Est-ce que quelqu'un sait ce qui cause cette erreur?
Nous vous remercions de votre réponse rapide! Je pensais qu'il était toujours recommandé de passer des arguments aux requêtes brutes dans l'argument "params". Je suis un débutant dans les questions de sécurité, donc j'ai essayé de l'utiliser toujours de cette façon. Mais c'est vrai que c'est une entrée de confiance dans ce cas. A propos du problème "EXISTS", je pense que je l'ai fait avant, mais d'une autre manière, et j'ai eu quelques problèmes de performance. Si j'ai raison, cette requête ferait une sous-requête pour chaque entrée de la table et la table contient beaucoup d'entrées (plus de 2000). Bien que je pense que j'avais fait cela, je voudrais essayer à nouveau. Merci beaucoup! – marianobianchi
@marianobianchi: 2000 entrées est assez petit, vous ne pouvez voir aucune différence entre 'IN' et' EXISTS'. –