奇怪的SQLAlchemy错误信息:TypeError:'dict'对象不支持索引

我正在使用手工制作的SQL从PG数据库获取数据,使用SqlAlchemy。 我正在尝试一个查询,其中包含SQL像运算符'%',似乎通过循环引发SqlAlcjhemy:

sql = """ SELECT DISTINCT u.name from user u INNER JOIN city c ON u.city_id = c.id WHERE c.designation=upper('fantasy') AND c.id IN (select id from ref_geog where short_name LIKE '%opt') """ # The last line in the above statement throws the error mentioned in the title. # However if the last line is change to: # AND c.id IN (select id from ref_geog where short_name = 'helloopt') # the script runs correctly. # # I also tried double escaping the '%' ie using '%%' instead - that generated the same error as previously. connectDb() res = executeSql(sql) print res closeDbConnection() 

任何人都知道是什么导致这个误导性的错误信息,我怎么可能解决它?

[[编辑]]

在任何人询问之前,对上述function并没有什么特别的或幻想的东西。 例如函数executeSql()只是调用conn.execute(sql)并返回结果。 variablesconn就是以前build立的与数据库的连接。

你必须给%%把它用作%因为python中的%被用作string格式,所以当你写单个%假设你将用这个replace一些值。

所以当你想把单个string与查询全部放在双倍%

SQLAlchemy有一个文本函数来包装文本,看起来正确地为你转义SQL。

 res = executeSql(sqlalchemy.text(sql)) 

应该为你工作,并免除你必须做的奇怪逃脱。

看来你的问题可能与这个bug有关 。

在这种情况下,您应该三重逃脱作为解决方法。

出现这个错误时,我发现了另一个案例:

 c.execute("SELECT * FROM t WHERE a = %s") 

换句话说,如果你在查询中提供参数( %s ),但是你忘记添加查询参数。 在这种情况下,错误信息是非常误导的。

这也可能是由案例导致的 – 如果要传递给SQL的参数在DICT formate中声明,并且正在以LIST或TUPPLE的forms在SQL中操作。

还有一点需要注意的是,您必须在注释中转义(或删除) %字符。 不幸的是, sqlalchemy.text(query_string)不会在注释中转义百分号。