回答編集履歴
4
test
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
この部分で、IN の右にある %s が、さきほど作成した stmt_formats (「%s,%s」)に置換されます。
|
22
22
|
```
|
23
23
|
・作成されるSQL文
|
24
|
-
"SELECT name, age, sex FROM info IN %s,%s"
|
24
|
+
"SELECT name, age, sex FROM info IN (%s,%s)"
|
25
25
|
```
|
26
26
|
|
27
27
|
③
|
@@ -29,7 +29,7 @@
|
|
29
29
|
db.execute("SELECT name, age, sex FROM info IN (%s)" % stmt_formats, tuple(names))
|
30
30
|
```
|
31
31
|
execute 関数の第2引数に、タブルを指定することで、プレースホルダに内容が渡されます。
|
32
|
-
SQL文は、 "SELECT name, age, sex FROM info IN %s,%s"
|
32
|
+
SQL文は、 "SELECT name, age, sex FROM info IN (%s,%s)"
|
33
33
|
tuple(names) ===> ("太郎", "史郎")
|
34
34
|
なので、1番目の %s に「太郎」2番目の %s に「史郎」が渡されます。
|
35
35
|
仮に太郎、史郎がSQLインジェクションの意図を持つ文字列であったとしても、エスケープされるため安全です。
|
3
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
リストの要素分のプレースホルダを用意し、安全に
|
1
|
+
リストの要素分のプレースホルダを用意し、安全に値を渡します。
|
2
2
|
```python
|
3
3
|
stmt_formats = ','.join(['%s'] * len(names))
|
4
4
|
db.execute("SELECT name, age, sex FROM info IN (%s)" % stmt_formats, tuple(names))
|
2
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
SQL文は、 "SELECT name, age, sex FROM info IN %s,%s"
|
33
33
|
tuple(names) ===> ("太郎", "史郎")
|
34
34
|
なので、1番目の %s に「太郎」2番目の %s に「史郎」が渡されます。
|
35
|
-
仮に太郎、史郎がSQLインジェクションの意図を持つ文字列であっても、エスケープされるため安全。
|
35
|
+
仮に太郎、史郎がSQLインジェクションの意図を持つ文字列であったとしても、エスケープされるため安全です。
|
36
36
|
|
37
37
|
※ f ストリングによって SQL を直接組み立てる方法は、SQL インジェクションを起こす危険があるため、以下のような場合を除き、安易に使用すべきではありません。
|
38
38
|
<f ストリング等での組み立てでもよい場合>
|
1
test
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
```
|
19
19
|
"SELECT name, age, sex FROM info IN (%s)" % stmt_formats
|
20
20
|
```
|
21
|
-
この部分で、IN のにある %s が、さきほど作成した stmt_formats (「%s,%s」)に置換されます。
|
21
|
+
この部分で、IN の右にある %s が、さきほど作成した stmt_formats (「%s,%s」)に置換されます。
|
22
22
|
```
|
23
23
|
・作成されるSQL文
|
24
24
|
"SELECT name, age, sex FROM info IN %s,%s"
|