2010-10-15 23 views
5

目前我正在嘗試搜索數據庫以獲取某些事件。我的查詢是這樣Psycopg2使用通配符導致TypeError

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

簡單地說,我需要通過查詢日曆事件的數據庫的外觀和與它和本月初之後「測試」的總結返回任何東西。

這將返回從數據庫命令行查詢時的預期結果。然而,當我試圖在我的Python腳本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 

做一些初步的谷歌搜索聽起來有點像與我使用的方法我的通配符。我可能是錯的,但我可能錯過了一些我看不到的東西。希望來自社區的新鮮眼睛可以糾正我的不好意思;)

回答

14

不確定這是否是問題的根源,但我認爲您需要跳過通配符或參數化邏輯會感到困惑。

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

我覺得%%是正確的逃逸,但它可能是\%

+0

嗯,確實解決這個問題。但是我不相信這是根本問題,因爲我試圖擺脫字典,只是在沒有替換的情況下運行該行,以查看通配符是否確實沒有被正確轉義。擺脫字典的工作,爲什麼我需要在使用字典時逃避通配符? – 2010-10-15 17:55:54

+0

底層參數替換使用'%'作爲特殊字符,意思是'嘿,替代我的字典中的值在這裏'。我的猜測是,如果你沒有通過字典,這個參數化邏輯會被完全忽略掉,所以你沒有機會被where子句中'%'的存在所困惑。換句話說,在參數化步驟中,您可能會窒息,而您不再這樣做。所以,如果你傳遞參數,你需要轉義特殊的%字符,否則不行。 – 2010-10-15 18:02:53

+0

好吧,這是有道理的。謝謝你,先生! – 2010-10-15 18:05:09

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() 

與用戶提供的搜索字符串就像這個腳本,你可能會想逃避任何「%」的在其中,我懷疑會否則是查詢中的合法通配符,但我還沒有得到那麼遠