MySQLdb で「SELECT ... WHERE ... IN ...」クエリが失敗するのはなぜですか?

Barbara Streisand
リリース: 2024-11-01 17:32:02
オリジナル
797 人が閲覧しました

Why is

MySQLdb を使用して "SELECT ... WHERE ... IN ..." を実行しています

からの SQL クエリの実行は成功しましたが、 MySQL コマンドラインでは、MySQLdb を使用して Python 内から「WHERE ... IN ...」構文を使用してクエリを実行すると問題が発生する可能性があります。問題を調査し、解決策を検討してみましょう。

あなたの場合、「IN」句で「bar」列をフィルタリングするクエリでは行を取得できませんが、「」をフィルタリングする同様のクエリでは行を取得できません。 "IN" を含む fooid" 列は成功します。この不一致は、MySQLdb がパラメータ化されたクエリを処理する方法に原因がある可能性があります。

値の配列を MySQLdb への引数として指定すると、それが一重引用符で囲まれた文字列のタプルに自動的に変換され、その結果、構文が正しくなくなります。 「IN」句。たとえば、コードは ['A','C'] を ("'A'","'C'") に変換します。 args=[['A','C']]

これを解決するには、SQL 文字列を手動で構築し、Python を使用して「IN」句の値を連結する必要があります。

Python 2 の場合は、次のコードを使用することもできます。
<code class="python">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
cursor.execute(sql, args)</code>
ログイン後にコピー

このコードは、次のように正しい数のプレースホルダー ('%s') を含む SQL 文字列を動的に生成します。配列内の値を反復処理し、それらをカンマで結合します。この手動で作成したクエリを実行すると、「bar」列が ('A','C')
<code class="python">args=['A', 'C']
sql='SELECT fooid FROM foo WHERE bar IN (%s)' 
in_p=', '.join(map(lambda x: '%s', args))
sql = sql % in_p
cursor.execute(sql, args)</code>
ログイン後にコピー
にある fooid が選択され、期待どおりの結果が得られます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!