7

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

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

简单地说,我需要查询来查看日历事件数据库,并在本月初之后返回带有“测试”摘要的任何内容。

从数据库命令行查询时,这将返回预期的结果。但是,当我尝试在带有 psycopg2 的 Python 脚本中使用它时:

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

做一些初步的谷歌搜索听起来像是我使用通配符的方式。不过,我可能是错的,而且我可能遗漏了一些我看不到的简单内容。希望来自社区的一双新眼睛能纠正我的笨拙;)

4

2 回答 2

23

不确定这是否是您问题的全部根源,但我认为您需要转义通配符,否则参数化逻辑会变得混乱。

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

编辑:10 多年后,我正在查看 psycopg2 问题中的一个不相关的错误,发现开发人员认为这是一个问题。我下面的评论是正确的。如果您在查询中传递参数,则必须转义 LIKE 子句中的百分号。如果你没有传递参数,那么你就不会逃避你的 LIKE 子句。

于 2010-10-15T16:58:47.957 回答
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()

使用此脚本中的用户提供的搜索字符串,您可能希望转义其中的任何“%”,否则我怀疑这将是查询中的合法通配符,但我还没有做到这一点

于 2011-06-15T20:20:52.577 回答