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;)
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? –
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. –
Được rồi. Cảm ơn ngài! –