2010-10-15 50 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() 

与用户提供的搜索字符串就像这个脚本,你可能会想逃避任何“%”的在其中,我怀疑会否则是查询中的合法通配符,但我还没有得到那么远