2011-12-28 16 views
56

私はSqlAlchemyを使用して手作りのSQLを使用してPGデータベースからデータを取得しています。私は「%」演算子のようなSQLを含むクエリをしようとしていますし、それがループをSqlAlcjhemyを投げるようだ:奇妙なSQLAlchemyエラーメッセージ:TypeError: 'dict'オブジェクトがインデックス処理をサポートしていません

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 '%' i.e. using '%%' instead - that generated the same error as previously. 

connectDb() 
res = executeSql(sql) 
print res 
closeDbConnection() 

いずれかが、この誤解を招くようなエラー・メッセージの原因となっているものと私はそれを修正する方法を知っていますか?

[[編集]]

いずれかを尋ねる前に、特別または上記に含ま機能についての空想は何もありません。たとえば、関数executeSql()は単にconn.execute(sql)を呼び出して結果を返します。変数connは、単に以前に確立されたデータベースへの接続です。

+0

あなたは 'executeSql(...)'のコードを投稿できますか?また、実際には 'SELECT'ステートメントに' RETURNING * 'がありますか? – van

+0

@van私はそれを逃した。問題の原因となっているSQLには「RETURNING *」はありません。私はその問題を訂正します。 –

+1

はこの回答です[http://stackoverflow.com/questions/3944276/psycopg2-using-wildcard-causes-typeerror]役立ちますか? – van

答えて

4

あなたの問題はthis bugと関連しているようです。

この場合、回避策として3回エスケープする必要があります。

91

あなたはPythonで%あなたは、単一の%を書くときには、あなたがこれでいくつかの値を置き換えるしようとしていることを前提としていので、フォーマット文字列として使用しているため%としてそれを使用する%%を与える必要があります。

したがって、%をクエリで文字列に配置する場合は、必ず%と置き換えてください。

+3

私は彼らがそのエラーメッセージを更新することを望む、私がそれを得るたびに、このページに着くと答えた – oshi2016

28

SQLAlchemyには、SQLを正しくエスケープするように見えるテキストを折り返すテキスト機能があります。

すなわち

res = executeSql(sqlalchemy.text(sql)) 

あなたのために働くと奇妙なエスケープを行うには持っていることからあなたを保存する必要があります。

+2

これは、選択された答えにする必要があります。それは私の場合の問題を解決しました。 –

+0

これはコメントをエスケープしないことに注意してください。そうでなければ素晴らしい解決策です。 – ClimbsRocks

0

これは、SQLに渡されるパラメータがDICT formateで宣言され、SQLでLISTまたはTUPPLEの形式で操作されている場合にも発生します。

1

私はこのエラーが現れるもう一つのケースが見つかりました:クエリでパラメータ(%s)を提供する場合、言い換えれば

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

をしますが、クエリのparamsを追加するのを忘れ。この場合、エラーメッセージは非常に誤解を招きます。

0

もう1つのコメント - コメントでも%文字をエスケープ(または削除)する必要があります。残念ながら、sqlalchemy.text(query_string)はコメント内のパーセント記号をエスケープしません。

関連する問題