2010-10-15 37 views
5

Hiện tại tôi đang cố tìm kiếm cơ sở dữ liệu để lấy một số sự kiện nhất định. truy vấn của tôi là như vậyPsycopg2 sử dụng ký tự đại diện gây ra TypeError

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

một cách đơn giản tôi cần truy vấn để xem xét thông qua một cơ sở dữ liệu của các sự kiện lịch và trở về bất cứ điều gì với một bản tóm tắt với 'test' trong đó và sau khi đầu tháng này.

Điều này trả về kết quả mong đợi khi được truy vấn từ dòng lệnh cơ sở dữ liệu. Tuy nhiên khi tôi cố gắng để sử dụng nó trong kịch bản Python của tôi với psycopg2 như vậy:

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

tôi nhận được một lỗi loại

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

Làm một số ban đầu Googling nó có vẻ giống như một cái gì đó với cách tôi đang sử dụng ký tự đại diện của tôi. Mặc dù tôi có thể sai và tôi có thể thiếu một thứ đơn giản mà tôi không thấy. Hy vọng rằng một đôi mắt mới từ cộng đồng có thể sửa lỗi của tôi;)

Trả lời

14

Không chắc chắn đây có phải là gốc rễ đầy đủ của vấn đề không, nhưng tôi nghĩ bạn cần phải thoát khỏi các ký tự đại diện hoặc logic tham số hóa.

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

Tôi nghĩ %% là thoát đúng, nhưng nó có thể là \%

+0

Hm để khắc phục điều đó. Nhưng tôi không tin rằng đó là vấn đề gốc vì tôi đã cố gắng loại bỏ từ điển và chỉ chạy dòng mà không cần thay thế để xem ký tự đại diện có thực sự không được thoát khỏi đúng không. Loại bỏ từ điển làm việc vậy tại sao tôi cần phải thoát khỏi ký tự đại diện khi sử dụng từ điển? –

+0

Sự thay thế tham số cơ bản sử dụng '%' như một ký tự đặc biệt có nghĩa là 'hey, thay thế một giá trị từ dict của tôi ở đây'. Đoán của tôi là nếu bạn không vượt qua dict, logic tham số hóa này bị bỏ qua hoàn toàn do đó không có cơ hội cho nó bị lẫn lộn bởi sự hiện diện của '%' trong mệnh đề where của bạn. Nói cách khác, nó có khả năng nghẹt thở * trong * bước tham số hóa mà bạn không còn làm nữa. Vì vậy, nếu bạn đang vượt qua các tham số, bạn cần phải thoát khỏi ký tự đặc biệt%, nếu không thì không. –

+0

Được rồi. Cảm ơn ngài! –

3

tôi đoán là điều gì đó về bạn "%" 's là khó hiểu python. trong psycopg2 tôi làm ký tự đại diện của tôi "like" truy vấn như thế này:


#!/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() 

với chuỗi tìm kiếm người dùng cung cấp giống như trong kịch bản này, bạn có lẽ sẽ muốn thoát ra bất kỳ "%" 's trong họ, mà tôi nghi ngờ sẽ nếu không là các ký tự đại diện hợp pháp trong truy vấn, nhưng tôi chưa nhận được điều đó đến mức nào

Các vấn đề liên quan