2017-02-14 3 views
2

レコード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')] 
+1

笑@「敗北のように感じています」 ;-) – bernie

答えて

1

あなたdelete_listが過度に長いあなたが何かを行うことができない提供:

place_holders = ",".join("?"*len(delete_list)) 
query_string = '''delete from strat where Id in ({})'''.format(place_holders) 
cur.execute(query_string, delete_list) 
+1

私はその答えについて掘り下げていたことをうれしく思っています。それをさらに読むことなく、IN文の999項目の上限を見つけるのにどれくらいの時間がかかりましたか分かりませんページ! – roganjosh

+1

ああ、それは間違いなく作ってみた... – bernie

関連する問題