今回の講義は前回の講義の続きだそうです。
前回の講義 027 Pythonでデータベースを扱ってみよう
タイトルにあるCRUD操作とは
- Create 作成
- Read 読み込み
- Update 更新
- Delete 削除
の頭文字だそうです。
これらの操作をSQLiteを使ってSQL文でどうやって
命令していくかを学びます。
とりあえずデータベースを作るところまでは
前回の講義でやっていますので、そのままコードを使います。
import sqlite3
import pandas as pd
df = pd.read_csv('/content/sample_data/california_housing_test.csv')
db_name = 'sample.db'
conn = sqlite3.connect(db_name)
conn
df.to_sql('housing',conn,if_exists='replace')
c = conn.cursor()
query = 'SELECT * FROM housing'
c.execute(query)
for row in c.execute(query):
print(row)
とここまでで
新規の空データベースを作成して
コネクト(接続)して
csvファイルをデータベースへ新しいテーブルとして入れて
実際にデータが入っているか確認する為に
プリント文で一行づつ出力
そしてデータベースをクローズするとこまでやりました。
CREATE
まずはCREATEからです。
SQL文では大文字で書くように言われますが
小文字でも問題ないみたいなので今回今西先生は
小文字で命令文を書いています。
前回全ての行のデータをとるという意味で
*(アスタリスク)を使いました。
count():何かを集計する時の命令文
の要素にを入れることによって行数を集計できます。
query = 'select count(*) from housing'
c.execute(query)
c.fetchone()
(3000,)
現在のデータの行数を把握した状態で
データを一行追加して、再度行数をカウントすることに
よってちゃんとデータが追加されたかを確認します。
今回作ったデータベース housing
の longitude atitude の値にそれぞれ
-122.05 と 37.37 の値を入れて新しい行を作成します。
query_create = '''
insert into housing (longitude,latitude)
values(-122.05,37.37 )
'''
c.execute(query_create)
で、先ほど実行した行数を数えるクエリーを実行して
c.fetchone()で出力結果を表示します。
c.execute(query)
c.fetchone()
(3001,)
無事 3,000 から3,001 に行数が増えているので
Create成功です。
実際にどのようにデータベースに入っているかをみるために
新たな命令文をつくります。
select文でテーブルの全てのデータを選択し、
limit で最大表示する行数を指定。
offset で何行目から表示スタートするかを指定します。
queryを作成したところで、
一行ごとにprintして見やすくするために
for文をつかって繰り返し処理をします。
query_select = '''
select * from housing
limit 10
offset 2999
'''
for row in c.execute(query_select):
print(row)
(2999, -119.63, 34.42, 42.0, 1765.0, 263.0, 753.0, 260.0, 8.5608, 500001.0)
(None, -122.05, 37.37, None, None, None, None, None, None, None)
ちゃんとlongitude atitudeの二つの項目に数値が入力されてます。
なんかちゃんと出力されると嬉しいですね!
READ
つぎはREADです。
レコードの参照はCREATEのところでやっあ
selectなどもそうらしいです。
データの中からlongitudeの列を出力します。
全部にすると3000個あるので今回は
fetchall ではなくfetchoneで一個だけ出力します。
query = 'select longitude from housing'
c.execute(query)
print(c.fetchall())
(-122.05,)
無事出力することができました。
このsql文ですが、今西先生いわく覚える必要はなくて
命令文をつくる際にその都度ネットで調べれば大丈夫だそうです。
select文で条件式を入れることも可能です。
whereで条件をいれます。
query = '''
select longitude from housing
where longitude >= -115
'''
c.execute(query)
c.fetchall()
[(-114.98,), (-114.61,), (-114.55,), (-114.49,), (-114.62,)]
UPDATE
update文をつかって一括処理のようなものをします。
housing のatitudeを全て2にします。
query = '''
update housing set latitude = 2
where longitude >= -115
'''
c.execute(query)
query = '''
select longitude,latitude from housing
where longitude >= -115
'''
c.execute(query)
c.fetchall()
[(-114.98, 2.0),
(-114.61, 2.0),
(-114.55, 2.0),
(-114.49, 2.0),
(-114.62, 2.0)]
元のデータ数が多いので条件式を入れて抽出していますが、
latitudeの項目が全て2.0になっているのがわかります。
DELETE
最後にデリートです。
まずは現在の行数をカウント。そして
前回のアップデートで
longitude >= -115
のデータのlatitudeを全て2でアップデートしたので
latitude=2以外のデータを全て削除してみます。
最後に削除後のデータ数をカウントします。
query='select count(*) from housing'
c.execute(query)
c.fetchone()
(3001,)
query_delete='''
delete from housing
where latitude !=2
'''
c.execute(query_delete)
c.execute(query)
c.fetchone()
(5,)
見事データの削除も成功しました。
まだまだ簡単な操作ではありますが、データベースの基本みたいなものを
学ぶことができました。
今西先生、有難うございました。
コメント