質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2859閲覧

python sql WHERE句に渡す値を配列にする

bane-ririn

総合スコア4

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/25 10:20

前提

pythonのsqlでWHERE句に渡す値を配列で受け渡すことが出来るように設計しています。
namesの配列の要素はinfoテーブルに属しています。

実現したいこと

sql文のWHERE句に渡す値を配列で実現したい

発生している問題・エラーメッセージ

name_dbにうまく情報を格納できていない

names = ["太郎", "史郎"] name_db = db.execute("SELECT name, age, sex FROM info IN ?", names)

試したこと

列名=any(配列名)を試したがうまくいかないようであった

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/09/25 11:00

names の要素数が 2 以上であれば、 name_db = db.execute(f"SELECT name, age, sex FROM info IN {tuple(names)}")
TakaiY

2022/09/25 12:00

(回答に書くべき > melianさん)
guest

回答1

0

ベストアンサー

リストの要素分のプレースホルダを用意し、安全に値を渡します。

python

1stmt_formats = ','.join(['%s'] * len(names)) 2db.execute("SELECT name, age, sex FROM info IN (%s)" % stmt_formats, tuple(names))

段階を追って説明すると下記のようになります。

stmt_formats = ','.join(['%s'] * len(names))

これによって、names の要素の数だけ プレースホルダ「%s」がカンマで区切られた文字列が作成されます。

・作成される文字列; %s,%s

"SELECT name, age, sex FROM info IN (%s)" % stmt_formats

この部分で、IN の右にある %s が、さきほど作成した stmt_formats (「%s,%s」)に置換されます。

・作成されるSQL文 "SELECT name, age, sex FROM info IN (%s,%s)"

python

1db.execute("SELECT name, age, sex FROM info IN (%s)" % stmt_formats, tuple(names))

execute 関数の第2引数に、タブルを指定することで、プレースホルダに内容が渡されます。
SQL文は、 "SELECT name, age, sex FROM info IN (%s,%s)" 
tuple(names) ===> ("太郎", "史郎")
なので、1番目の %s に「太郎」2番目の %s に「史郎」が渡されます。
仮に太郎、史郎がSQLインジェクションの意図を持つ文字列であったとしても、エスケープされるため安全です。

※ f ストリングによって SQL を直接組み立てる方法は、SQL インジェクションを起こす危険があるため、以下のような場合を除き、安易に使用すべきではありません。
<f ストリング等での組み立てでもよい場合>

  • 渡す変数が(安全な値の)固定値である。
  • 固定値でない場合は、渡す変数が、別の処理であらかじめエスケープされている。

(質問からは、固定値かどうか、エスケープしているかどうかが確定的には不明だったため)

投稿2022/09/25 11:24

編集2022/09/25 12:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bane-ririn

2022/09/25 12:32

ありがとうございます。とても丁寧に教えて下さりありがとうございました、勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問