Psycopg2使用通配符导致TypeError
目前我正在尝试搜索一个数据库,以获取某些事件。我的查询语句是这样的:
SELECT * FROM events WHERE summary ILIKE E'%test%' AND start_time > '2010-10-01'
简单来说,我需要这个查询去查找一个日历事件的数据库,返回所有摘要中包含“test”的事件,并且这些事件是在本月开始之后的。
当我从数据库的命令行查询时,这个查询能返回我想要的结果。然而,当我尝试在我的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
我在网上查了一下,感觉可能是我使用通配符的方式有问题。不过我也可能错了,可能是我漏掉了什么简单的东西,希望社区的朋友们能帮我看看,纠正我的小白错误;)
2 个回答
3
我猜你的“%”符号让Python有点困惑。在使用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()
如果你有用户输入的搜索字符串,就像这个脚本里那样,你可能需要把里面的“%”符号进行转义。因为我怀疑这些“%”符号在查询中会被当作合法的通配符,但我还没有深入研究到这一步。
24
我不确定这是否是你问题的根本原因,但我觉得你需要对通配符进行转义,否则参数化的逻辑可能会搞混。
SELECT * FROM events WHERE summary ILIKE E'%%test%%' AND start_time > %(begin)s
补充:十多年后,我在查看psycopg2的其他问题时,发现开发者们承认这是一个问题。我之前的评论是正确的。如果你在查询中传递参数,那么在LIKE子句中必须对百分号进行转义。如果你没有传递参数,那么LIKE子句就不需要转义。