Psycopg2使用通配符导致TypeError

7 投票
2 回答
11118 浏览
提问于 2025-04-16 05:33

目前我正在尝试搜索一个数据库,以获取某些事件。我的查询语句是这样的:

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子句就不需要转义。

撰写回答