ホームページ >データベース >mysql チュートリアル >MySQLdb でパラメータ化されたクエリを使用すると「SELECT ... WHERE ... IN ...」が失敗するのはなぜですか?
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 サイトの他の関連記事を参照してください。