ホームページ  >  記事  >  データベース  >  MySQLdb でパラメータ化されたクエリを使用すると「SELECT ... WHERE ... IN ...」が失敗するのはなぜですか?

MySQLdb でパラメータ化されたクエリを使用すると「SELECT ... WHERE ... IN ...」が失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 21:46:02680ブラウズ

Why Does

MySQLdb を使用した "SELECT ... WHERE ... IN ..." の実行

使用した IN 句を含む SQL クエリの実行MySQLdb は、特に SQL パラメータが使用されている場合に困難になる可能性があります。同様のクエリは mysql コマンドラインからは正しく機能する可能性がありますが、Python での実行では問題が発生する可能性があります。

ケーススタディ

次の SQL クエリを考えてみましょう:

SELECT fooid FROM foo WHERE bar IN ('A', 'C')

mysql コマンドを使用して Python 内からこのクエリを実行しようとすると、次の SQL が生成されます:

<code class="python">sql = 'SELECT fooid FROM foo WHERE bar IN %s'
args = [['A', 'C']]</code>

しかし、このクエリは実行時に 2 つの行を期待しているにもかかわらず、行を返しません。 。興味深いことに、Python クエリで bar と fooid の役割を切り替えることにより、期待される行が正常に取得されます。

<code class="python">sql = 'SELECT bar FROM foo WHERE fooid IN %s'
args = [[1, 3]]</code>

根本原因

動作の不一致の原因MySQLdb がクエリの実行中にパラメータ化された引数 ['A', 'C'] を ("''A''"', "'''''C''"") に変換する方法から。マークは IN 句を無効にします。

解決策

MySQLdb にはリストを IN 句にバインドする組み込みメソッドがないため、クエリ パラメータを手動で構築する必要があります。次のように:

<code class="python"># Python 3
args = ['A', 'C']
sql = 'SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p = ', '.join(list(map(lambda x: '%s', args)))
sql = sql % in_p

# Python 2
args = ['A', 'C']
sql = 'SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p = ', '.join(map(lambda x: '%s', args))
sql = sql % in_p</code>

正しい数のプレースホルダーを使用して IN 句を手動で構築すると、クエリが正常に実行され、期待される行が返されます。

以上がMySQLdb でパラメータ化されたクエリを使用すると「SELECT ... WHERE ... IN ...」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。