プレースフォルダを使うことによってsql文の定型の部分と処理内容によって変化する部分使い分けることができます。
?マークを使う方法
executeメソッドのオプション引数(第2引数)にタプルまたはリストを渡すと「?」マークのある場所にオブジェクトが順番に埋め込まれます。
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
#テーブル作成
c.execute('''create table stocks
(date text, trans text, symbol text,
qty real, price real)''')
#テーブルに値の登録
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-06','BUY2','RHAT2',100,35.15)")
a = c.execute("SELECT * FROM stocks WHERE trans=? OR trans=?", ['BUY2', 'BUY'])
print('Content-type: text/html; charset=UTF-8\n')
for aa in a:
print(aa)
#出力
#('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) ('2006-01-06', 'BUY2', 'RHAT2', 100.0, 35.15)
15行目でexecuteメソッドの第2引数にリストを渡しています。
リストの「BUY2」が最初の「?」に、「BUY」が2番目の「?」に埋め込まれます。
下記のようにリスト及びタプルを変数に格納して使うこともできます。
b = ['BUY2', 'BUY']
a = c.execute("SELECT * FROM stocks WHERE trans=? OR trans=?", b)
辞書を使う方法
辞書のキーを使って置換する場所を指定する方法です。
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
#テーブル作成
c.execute('''create table stocks
(date text, trans text, symbol text,
qty real, price real)''')
#テーブルに値の登録
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-06','BUY2','RHAT2',100,35.15)")
a = c.execute("SELECT * FROM stocks WHERE trans=:b1 OR trans=:b2", {'b1':'BUY2', 'b2':'BUY'})
print('Content-type: text/html; charset=UTF-8\n')
for aa in a:
print(aa)
#出力
#('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) ('2006-01-06', 'BUY2', 'RHAT2', 100.0, 35.15)
置換場所のキーの前に「:」をつけます。
下記のように辞書を変数に格納して使うこともできます。
b = {'b1':'BUY2', 'b2':'BUY'}
a = c.execute("SELECT * FROM stocks WHERE trans=:b1 OR trans=:b2", b)