2010-10-15 7 views
5

Actuellement, j'essaie de rechercher une base de données pour récupérer certains événements. Ma requête est en tant que tellePsycopg2 utilisant des causes génériques TypeError

SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > '2010-10-01' 

En termes simples, je besoin de la requête de regarder à travers une base de données des événements de calendrier et retourner quoi que ce soit avec un résumé de « test » dans et après le début de ce mois-ci.

Cette opération renvoie les résultats attendus lorsqu'elle est interrogée à partir de la ligne de commande de la base de données. Cependant, lorsque je tente de l'utiliser dans mon script Python avec psycopg2 en tant que tel:

cursor.execute("SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > %(begin)s ", {'begin' : datetime.datetime(2010,10,1) }) 

Je reçois une erreur de type

*** TypeError: 'dict' object does not support indexing 

Faire une première recherche sur Google cela ressemble à quelque chose avec la façon dont je me sers mes caractères génériques. Je peux me tromper et il me manque probablement quelque chose de simple que je ne vois pas. Heureusement, une nouvelle paire d'yeux de la communauté peut corriger ma noobishness;)

Répondre

14

Vous ne savez pas si c'est la racine complète de votre problème, mais je pense que vous devez échapper à vos caractères génériques ou la logique de paramétrage sera confuse.

SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s 

Je pense que %% est l'échappement correct, mais il pourrait être \%

+0

Hm qui corrige cela. Mais je ne crois pas que ce soit le problème de base puisque j'ai essayé sur un caprice de se débarrasser du dictionnaire et de courir la ligne sans substitution pour voir si le joker n'était pas bien échappé. Se débarrasser du dictionnaire a fonctionné alors pourquoi ai-je besoin d'échapper le joker quand un dictionnaire est utilisé? –

+0

La substitution des paramètres sous-jacents utilise '%' comme caractère spécial signifiant 'hé, substituez une valeur de mon dict ici'. Ma conjecture est que si vous ne passez pas la dict, cette logique de paramétrage est complètement ignorée, donc il n'y a aucune chance qu'elle soit troublée par la présence de '%' dans votre clause where. En d'autres termes, il est probable qu'il étouffe * dans * l'étape de paramétrage que vous ne faites plus. Donc, si vous passez des paramètres, vous devez échapper le caractère spécial%, sinon non. –

+0

D'accord, c'est logique. Merci Monsieur! –

3

ma conjecture est quelque chose sur votre "%" de python est source de confusion. en psycopg2 je fais mon joker « comme » requêtes comme ceci:


#!/usr/bin/python 

import sys,os.path,psycopg2 
db=psycopg2.connect("dbname=music") 

for line in sys.argv[1::]: 
    cursor=db.cursor() 
    key="%"+line+"%" 
    cursor.execute("select count(*) from pool where path like %s",(key,)) 
    if cursor.fetchone()[0] != 1: 
     sys.stderr.write("ambiguous stem or no such song") 
     sys.exit(-1) 
    cursor.execute("insert into spool select path from pool where path like %s",(key,)) 
    cursor.close() 
    db.commit() 
db.close() 

avec des chaînes de recherche fournis par l'utilisateur comme dans ce script, vous auriez probablement eu envie d'échapper à toute « % » de en eux, que je soupçonne serait sinon être des caractères génériques légitimes dans la requête, mais je n'ai pas encore obtenu cela loin

Questions connexes