レコードIDがPythonリストと一致するテーブルからレコードを削除したい。IN演算子を使用してsqliteクエリを適切にパラメータ化する
例データ:
dbfile = ':memory:'
conn = sqlite3.connect(dbfile)
cur = conn.cursor()
cur.executescript('''BEGIN TRANSACTION;
CREATE TABLE `strat` (
`Id` INTEGER NOT NULL,
`thing1` TEXT NOT NULL,
`thing2` NUMERIC NOT NULL,
PRIMARY KEY(`Id`)
);
INSERT INTO `strat` (Id,thing1,thing2)
VALUES (1,'0','delete'),
(2,'34','delete'),
(3,'456','delete'),
(4,'458','keep'),
(5,'998','keep'),
(6,'1000','delete'),
(7,'2001','delete');
COMMIT;''')
cur.execute('''select * from strat'''); cur.fetchall()
#Out[32]:
#[(1, '0', 'delete'),
#(2, '34', 'delete'),
#(3, '456', 'delete'),
#(4, '458', 'keep'),
#(5, '998', 'keep'),
#(6, '1000', 'delete'),
#(7, '2001', 'delete')]
私は私が他の場所での処理から削除するレコードのIDを見つけます。ここで私は1,2,3,6,7
delete_list = [1,2,3,6,7]
所望の出力のIDを持つレコードを削除する:これは動作しません
[(4, '458', 'keep'),
(5, '998', 'keep')]
:
cur.execute('''DELETE FROM strat WEHRE Id IN ?''', delete_list)
しかし、同等のsqliteシェルで動作します:
DELETE FROM strat WHERE Id IN (1,2,3,6,7)
私は作品ループ、に頼ってきたが、それは敗北のように感じている:
for id in delete_list:
cur.execute('''delete from strat where Id = ?''', (id,))
conn.commit()
cur.execute('''select * from strat'''); cur.fetchall()
#Out[50]: [(4, '458', 'keep'), (5, '998', 'keep')]
笑@「敗北のように感じています」 ;-) – bernie