計算機科学のブログ

SQL - Python - DELETE文とUPDATE文 - 役に立つ変更 - WHERE句

Head First SQL ―頭とからだで覚えるSQLの基本Lynn Beighley(著)、 佐藤 直生(監訳)、 松永 多苗子(翻訳)、 オライリージャパンの 3章(DELETE文とUPDATE文 - 役に立つ変更)、p.133(WHERE句を伴うDELETE文になってみよう)の解答を求めてみる。

schema3_0.sql

drop table if exists doughnut_ratings;
create table doughnut_ratings(
    location text,
    time text,
    date text,
    type text,
    rating integer,
    comments text
);
insert into doughnut_ratings (
    location,
    time,
    date,
    type,
    rating,
    comments
) values
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁'),
('ダンカンズドーナツ', '午前 8:59', '8/25', NULL, 6, '油っこい'),
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい'),
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない');

schema3_1.sql

delete from doughnut_ratings
where location = 'クリスピーキング'
and rating <> 6;

schema3_2.sql

delete from doughnut_ratings
where location = 'クリスピーキング'
and rating = 3;

schema3_3.sql

delete from doughnut_ratings
where location = 'スナッピーベーグル'
and rating >= 6;

schema3_4.sql

delete from doughnut_ratings
where location = 'クリスピーキング'
or rating > 5;

schema3_5.sql

delete from doughnut_ratings
where location = 'クリスピーキング'
or rating = 3;

コード

sample3.py

#! /usr/bin/env python3
import sqlite3

con = sqlite3.connect('sample.sqlite')
cur = con.cursor()

for i in range(12):
    if i % 2 == 0:
        with open(f'schema3_0.sql') as f:
            cur.executescript(f.read())
    else:
        with open(f'schema3_{i // 2 + 1}.sql') as f:
            cur.executescript(f.read())
    cur.execute(
        """
select * from doughnut_ratings
"""
    )
    if (d := cur.description) is not None:
        print([t[0] for t in d])
    for row in cur.fetchall():
        print(row)
cur.close()
con.close()

入出力結果(Terminal, Zsh)

% ./sample3.py            
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
['location', 'time', 'date', 'type', 'rating', 'comments']
('クリスピーキング', '午前 8:50', '9/27', 'プレーンキレーズド', 10, 'ほとんど完壁')
('ダンカンズドーナツ', '午前 8:59', '8/25', None, 6, '油っこい')
('スターバズコーヒー', '午後 7:35', '5/24', 'シナモンケーキ', 5, '堅いけど、おいしい')
('スターバズコーヒー', '午後 7:03', '4/26', 'シャム', 7, 'シャムが足りない')
%