1

次のエラーが発生します。

  File "sqldata/basetables/places.py", line 24, in update
    sqldata.objs.c.execute("UPDATE places SET name='%s', matrix='%s', bans='%s', pop='%s' WHERE name='%s'" % (place.name,place.matrix,place.bans,place.pop,name))
sqlite3.OperationalError: near "bob": syntax error

私が持っている場所:

>>> place.name
'room'
>>> place.matrix
[['bob', False, False], [False, False, False], [False, False, False]]
>>> place.bans
[]
>>> place.pop
[]
>>> name
'room'

何らかの理由で、一重引用符bobで置き換える'bob'とエラーが発生しているように見えますTrueが、一重引用符で囲んでroomもエラーは発生しません。これを修正するための最良のアプローチは何ですか? オブジェクトではなく文字列が必要なので、 に'bob'置き換えることはできません。bob


ここここにある提案を試しましたが、文字列は同じままです。、、、 、にも置き換え'bob'てみました。それはすべて構文エラーになります。''bob''u'''bob'''"bob""'bob'""\'bob\'"

SQL クエリから一重引用符を削除すると、次のようになります。

  File "sqldata/basetables/places.py", line 24, in update
    sqldata.objs.c.execute("UPDATE places SET name=%s, matrix=%s, bans=%s, pop=%s WHERE name=%s" % (place.name,place.matrix,place.bans,place.pop,name))
sqlite3.OperationalError: near ",": syntax error
4

1 に答える 1

3

実行するために送信する前に、SQL 文字列をログに記録します。matrix投稿の値を指定すると、次のようになることがわかります。

UPDATE places SET name='room', matrix='[['bob', False, False], [False, False, False], [False, False, False]]'

明らかに、'[['bob'有効な文字列ではありません。一重引用符を開き、開き括弧の後でもう一度閉じますが、関係なく文字列を続けます。渡す値を変更しても、これを修正することはできません。SQL 文字列を変更する必要があります。

1 つの (非常に悪い) 解決策は、SQL 文字列で単一引用符ではなく二重引用符を使用することです。

"""UPDATE places SET name="room", matrix="[['bob', False, False]..."""

これは少なくとも有効です。

しかし、これを行うべきではありません。Python DB API で提供されているテンプレートを使用する必要があります。

"UPDATE places SET name=?, matrix=?, bans=?, pop=? WHERE name=?", (place.name,place.matrix,place.bans,place.pop,name)

これにより、db ドライバー自体が補間を実行し、SQL インジェクションから保護されます。これが重要な理由については、http://bobby-tables.com/を参照してください。

于 2013-06-04T13:56:50.773 に答える