【问题标题】:Psycopg2 using wildcard causes TypeError使用通配符的 Psycopg2 导致 TypeError
【发布时间】:2011-04-26 01:10:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: python psycopg2


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,确实可以解决这个问题。但我不认为这是根本问题,因为我一时心血来潮地尝试摆脱字典并在没有替换的情况下运行该行,以查看通配符是否确实没有被正确转义。摆脱字典是有效的,那么为什么在使用字典时我需要转义通配符?
    • 底层参数替换使用“%”作为特殊字符,意思是“嘿,在这里替换我的字典中的值”。我的猜测是,如果您不传递 dict,则此参数化逻辑将完全跳过,因此它不会因 where 子句中存在 '%' 而感到困惑。换句话说,它可能会阻塞 in 您不再执行的参数化步骤。因此,如果您要传递参数,则需要转义特殊的 % 字符,否则不需要。
    • 好吧,这是有道理的。谢谢楼主!
    • 使用反斜杠 ("\%") 对我不起作用 python 3.6 mac osx
    • @RSHAP 谢谢,我在最近的编辑中删除了这句话。 %% 是这里的逃生方式。
    【解决方案2】:

    我的猜测是关于你的“%”的东西是混淆 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()
    

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

    【讨论】:

      猜你喜欢
      • 2018-08-27
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多