1

ループ内で実行されるクエリ文字列があり、リストクエリ内のすべてのアイテムに対して実行されます。リストには文字列が含まれており、反復の進行に合わせて、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'>
4

3 に答える 3

4

2 つの引数を指定して呼び出すdbCursor.executeと、DB アダプターが引数を引用します。詳細については、DB-API 仕様を参照してください。

query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''
args = [u"{this_name}%".format(this_name=list_name)]
self.dbCursor.execute(query, args)

%sinはパラメータ マーカーqueryです。で指定された引用符で囲まれたパラメーターに置き換えられます。使用する正しいパラメーター マーカーは、DB アダプターによって異なります。たとえば、MySQLdbは を使用しますが、oursqlsqlite3は を使用します。args%s?

パラメーター化された SQL を使用することをお勧めします。引数を自分で引用する必要はありません。


エラーに関して、あなたはそれを投稿します

this_name= Sentōkisei type= <type 'unicode'>

この手段format_nameはユニコードであると仮定します。したがって、

args = [u"{this_name}%".format(this_name=format_name)]

args1 つの Unicode を含むリストを作成します。

ここで、エラーが発生している行に到達します。

self.dbCursor.execute(query.encode('utf-8'), args)

queryはすでにunicode。そのユニコードをエンコードすると、str. もそうquery.encode('utf-8')ですがstrargsのリストですunicode。なぜエンコードしたかったのかわかりませんqueryが、DB アダプターは 2 つの Unicode 引数を取ることができるはずです。だから試してみてください

self.dbCursor.execute(query, args)

コメントを読み直すと、これを試したようで、同じエラーが発生します。

UnicodeEncodeError: 'latin-1' codec can't encode character u'\u014d' in position 75: ordinal not in range(256)

latin-1代わりに、必要なときにDB アダプターが Unicode をエンコードしようとしている理由がわかりませんutf-8latin-1最善の解決策は、この選択がどこから来たのかを追跡することです。

ハックな回避策は、文字列を自分でエンコードしてみることです。

query = u'''SELECT something FROM some_table WHERE some_name LIKE %s'''.encode('utf-8')
args = [u"{this_name}%".format(this_name=list_name).encode('utf-8')]
self.dbCursor.execute(query, args)

しかし、これが最善の方法だとは思いませんし、必要であるとも思いません。

于 2013-04-27T15:43:24.457 に答える
0

ここに同様の質問への回答を追加しました。こちらもご覧ください。

リンク: https://stackoverflow.com/a/61042304/8939258

于 2020-04-05T12:09:00.967 に答える