奇怪的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)
不会在注释中转义百分号。