ループ内で実行されるクエリ文字列があり、リストクエリ内のすべてのアイテムに対して実行されます。リストには文字列が含まれており、反復の進行に合わせて、Python 文字列形式の手法を使用して、クエリをリストのそれぞれの文字列に置き換えます。
リストの文字列とともにクエリをユニコード化しました: これがユニコード化されたクエリです:
query = ur'''SELECT something FROM some_table WHERE some_name LIKE "{this_name}%"'''
実行する前に、クエリ文字列をエンコードしますutf-8
try:
formatted_query = query.format(this_name=list_name)
#encode the query
encoded_q = formatted_query.encode('utf-8')
# execute the query
self.dbCursor.execute(encoded_q)
row = self.dbCursor.fetchone()
except Exception, e:
traceback.print_exc()
しかし、問題は、一重引用符が含まれるリストから文字列に遭遇することがあることです example: foo's
。私はすでに utf-8 でユニコード化しており、そうすることで、このような状況を心配する必要はないと考えました。しかし、MySQL は一重引用符をスキップしていないため、SQL エラーが発生します。
私の次の試みは、単一引用符を置き換えることでした:
format_string = u"foo's".replace(u"'",u"\'")
しかし、これもうまくいきませんでした。また、この質問への回答は、私が認識していない mysqldb ライブラリの組み込み機能を使用していることもわかったので、stackoverflow コミュニティに助けを求めてこの問題を解決しました。
回答で提案された解決策を反映するようにコードを変更しますが、結果は同じです:ここに変更があります:
args = [u"{this_name}%".format(this_name=format_name)]
self.dbCursor.execute(query.encode('utf-8'), args)
#error は、次の行でスローされます。
エラー:
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 4: ordinal not in range(256)
これはエラーが発生している文字列であり、その文字列のタイプがユニコード文字列であることを確認しました。
this_name= Sentōkisei type= <type 'unicode'>