2010-10-15 10 views
5

वर्तमान में मैं कुछ घटनाओं को पकड़ने के लिए डेटाबेस खोजने का प्रयास कर रहा हूं। मेरे क्वेरी जैसेवाइल्डकार्ड का उपयोग करते हुए साइकोप 2 टाइपरर

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

के रूप में सीधे शब्दों में कहें मैं क्वेरी की जरूरत कैलेंडर घटनाओं के एक डेटाबेस के माध्यम से देख सकते हैं और उस में और इस महीने की शुरुआत के बाद 'परीक्षण' के साथ एक सारांश के साथ कुछ भी वापस जाने के लिए है।

यह डेटाबेस कमांड लाइन से पूछे जाने पर अपेक्षित परिणाम देता है। लेकिन जब मैं इस तरह के रूप psycopg2 के साथ अपने अजगर स्क्रिप्ट में इसका इस्तेमाल करने का प्रयास:

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

मैं एक प्रकार की त्रुटि

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

कुछ प्रारंभिक Googling यह रास्ता नहीं मैं उपयोग कर रहा हूँ के साथ कुछ की तरह लगता है कर पाने मेरे वाइल्डकार्ड हालांकि मैं गलत हो सकता था और शायद मुझे कुछ आसान याद आ रहा है जिसे मैं नहीं देख रहा हूं। उम्मीद है कि समुदाय से आंखों की एक नई जोड़ी मेरी नोबिशनेस को सही कर सकती है;)

उत्तर

14

सुनिश्चित नहीं है कि यह आपकी समस्या का पूर्ण जड़ है, लेकिन मुझे लगता है कि आपको अपने वाइल्डकार्ड से बचने की आवश्यकता है या पैरामीटरकरण तर्क भ्रमित हो जाएगा।

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

मुझे लगता है कि %% सही एस्केपिंग है, लेकिन यह \%

+0

एचएम जो इसे ठीक करता है। लेकिन मुझे विश्वास नहीं है कि यह मूल समस्या है क्योंकि मैंने शब्दकोश से छुटकारा पाने की कोशिश की और केवल प्रतिस्थापन के बिना लाइन को चलाने के लिए यह देखने के लिए कि वाइल्डकार्ड वास्तव में से बच नहीं रहा था या नहीं। शब्दकोश से छुटकारा पाने के लिए काम किया जाता है तो एक शब्दकोश का उपयोग होने पर मुझे वाइल्डकार्ड से बचने की ज़रूरत क्यों है? –

+0

अंतर्निहित पैरामीटर प्रतिस्थापन '%' का उपयोग एक विशेष चरित्र के रूप में करता है जिसका अर्थ है 'अरे, मेरे यहां से मेरे नियम से मूल्य को प्रतिस्थापित करें'। मेरा अनुमान है कि यदि आप निर्देश पारित नहीं करते हैं, तो यह पैरामीटरकरण तर्क पूरी तरह से छोड़ दिया जाता है, इसलिए आपके पास खंड में '%' की उपस्थिति से भ्रमित होने का कोई मौका नहीं है। दूसरे शब्दों में, यह * पैरामीटरेशन चरण में * हो रहा है जो आप अब नहीं कर रहे हैं। इसलिए, यदि आप पैरामीटर पास कर रहे हैं तो आपको विशेष% चरित्र से बचने की ज़रूरत है, अन्यथा नहीं। –

+0

ठीक है कि समझ में आता है। धन्यवाद महोदय! –

3

मेरा अनुमान है अपने "%" के बारे में की अजगर भ्रामक कुछ है हो सकता है। psycopg2 में मैं इस तरह के प्रश्नों "की तरह" मेरे वाइल्डकार्ड कार्य करें:


#!/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() 
उपयोगकर्ता के आपूर्ति की तलाश किए जाने के साथ

की तरह इस स्क्रिप्ट में आप शायद किसी भी "%" उन में है, जो मैं संदेह होगा बाहर से बचने के लिए चाहते हो जाएगा अन्यथा क्वेरी में वैध वाइल्डकार्ड बनें, लेकिन मुझे अब तक यह नहीं मिला है कि अभी तक

संबंधित मुद्दे