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 サイトの他の関連記事を参照してください。