2

私はこのような機能を持っています:

def func(self, id):
    self.cursor.execute("SELECT * FROM my_table WHERE id=?", (id,))

これは、id に整数値を渡すと機能します。

obj.func(id=55)

今、私はこの関数を次のように再利用したいと思うかもしれません:

obj.func(id="associated_id")

associated_id は、実際には my_table の 2 番目の列です。ただし、これは機能しません (id==associated_id の行があっても結果が見つかりません)。

関数を次のように変更すると機能します。

def func(self, id):
    self.cursor.execute("SELECT * FROM my_table WHERE id=%s" % str(id))

最初のバージョンが機能しないのはなぜですか? ネイティブの python 文字列フォーマットの代わりに sqlite3.execute パラメータを使用してこの問題を解決する方法はありますか?

4

2 に答える 2

1

最初のケースでは、パラメーター バインディングを行っています。どちらが正しいですか、sqlite ライブラリは値 55 をクエリ呼び出しにバインドします。2 番目のケースでは、SQL が次のようになるため、パラメータ バインディングを使用しないでください。

SELECT * FROM my_table WHERE id='associated_id'

バインディング呼び出しは、文字列を渡していることを検出し、内部的に文字列のように扱うためです。

あなたがするとき

"SELECT * FROM my_table WHERE id=%s" % str(id)

パラメータバインドはせず、SQLをそのままsqliteに渡すだけです。

パラメータバインディングに関するいくつかのドキュメント:

http://www.sqlite.org/c3ref/bind_blob.html

于 2013-04-20T00:17:26.697 に答える
0

「?」SQL では、「55」など、クエリの実行時に提供される値を表します。

「associated_id」は、「?」を介して渡す場合、テーブル内の列の名前です。プレースホルダーの場合、文字列として扱われます。データベースがこれを列名として認識する方法はありません。

于 2013-04-20T00:11:35.450 に答える