16

SQLiteに関するこの投稿では、aaronasterlingは私に次のように語っています

  • cmd = "attach \"%s\" as toMerge" % "b.db": 間違っている
  • cmd = 'attach "{0}" as toMerge'.format("b.db"): 正しい
  • cmd = "attach ? as toMerge"; cursor.execute(cmd, ('b.db', )):正しいことです

でも、1回目と2回目は同じだと思いました。これら3つの違いは何ですか?

4

3 に答える 3

20
"attach \"%s\" as toMerge" % "b.db"

'の代わりに使用する必要が"あるため、エスケープする必要はありません。

非推奨の古いフォーマット文字列を使用しました。

'attach "{0}" as toMerge'.format("b.db")

これは、可能であれば古いバージョンの代わりに使用する必要がある新しいPythonバージョンの新しいフォーマット文字列機能を使用します。

"attach ? as toMerge"; cursor.execute(cmd, ('b.db', ))

これは文字列のフォーマットを完全に省略し、代わりにSQLite機能を使用するため、これが正しい方法です。

大きな利点:SQLインジェクションのリスクがない

于 2010-09-11T17:56:29.927 に答える
6

1番目と2番目は同じ結果を生成しますが、新しいバージョンのPythonで文字列をフォーマットするには、2番目の方法が推奨されます。

ただし、3つ目は、文字列を操作する代わりにパラメーターを使用するため、ここではより適切なアプローチです。これは、より高速で安全です。

于 2010-09-11T17:51:48.227 に答える
3

逃げられていないから。b.dbをユーザー入力に置き換えると、SQLインジェクションに対して脆弱なままになります。

于 2010-09-11T17:47:47.473 に答える