web-dev-qa-db-ja.com

Python:ValueError:インデックス1でサポートされていないフォーマット文字 '' '(0x27)

Python経由でMySQLを使用して、データベース内の3つのテーブルを検索するクエリを実行しようとしています。次の文字列をクエリとして実行しようとするたびに、文字列の連結に関するエラーが発生します。

"SELECT fileid FROM files WHERE description LIKE '%" + search + "%' OR filename LIKE '%" + search + "%' OR uploader LIKE '%" + search + "%' ORDER BY fileid DESC"

これは私に与えるエラーです:

ValueError: unsupported format character ''' (0x27) at index 1

要求する文字を削除する場合は、%も削除する必要があります。これにより、クエリが実際に正しく動作しなくなります。私はPythonが初めてなので、これを修正するために何ができますか。

ありがとう、クリス

23
user1558746

pythonは%をprintfのようなフォーマット文字として解釈しています。%%を使用してみてください。

"SELECT fileid 
FROM files 
WHERE description LIKE '%%%s%%' 
    OR filename LIKE '%%%s%%' 
    OR uploader LIKE '%%%s%%' 
    ORDER BY fileid DESC" % (search, search, search)
63
Pochi

参考までに:今日、@ PochiのソリューションをPython 3.6で試してみましたが、何らかの理由で予期しない動作を引き起こしました。フォーマット文字列には2つ、3つの引数がありました最後は:

% (Search, Search)

私の文字列( "検索")は、上部の "S"で始まりました。エラーメッセージが表示されました。

ValueError: unsupported format character 'S' (0x53) at index 113

大文字を小文字に変更しましたが、エラーは次のとおりです。

TypeError: not enough arguments for format string

その後、引数の最初と最後をダブル%%の内側に入れるだけで機能しました。だから私のコードは次のように見えました:

"SELECT fileid 
FROM files 
WHERE description LIKE '%%search%%' 
    OR filename LIKE '%%search%%'
    ORDER BY fileid DESC"

別の解決策は、@ Alice Yuanが提供するものです。彼女は歌の割合を2倍にしただけで、うまくいきます。

1
vlad.rad

私の解決策:

query = """SELECT id, name FROM provice WHERE name LIKE %s"""
cursor.execute(query, '%%%s%%' % name)

この問題を解決する簡単な方法だと思います!

0
CK.Nguyen

あなたはこのように試すことができます:

SELECT fileid 
FROM files 
WHERE description LIKE '%%%%%s%%%%' 
OR filename LIKE '%%%%%s%%%%' 
OR uploader LIKE '%%%%%s%%%%' 
ORDER BY fileid DESC" % (search, search, search)
0
Alice Yuan