Pythonista リレーショナルデータベース SQLite

Python学習【365日チャレンジ!】139日目のマスターU(@Udemy11)です。

最近知ったのですが、スケベ虫なんて名前の虫がいるそうです。

体長が1mm〜2mm程度で、網戸もすり抜けて気づかないうちに服の中に潜り込み、皮膚を噛んで傷つけて出てきた血を吸うそうです。

噛まれると強烈な痒みに襲われて、ひどい時は1ヶ月以上も続くらしいです。

以前、結構長い期間、痒みが治らない時があったので、ダニか何かかな?と思っていたのですが、もしかしたらこのスケベ虫だったのかもしれません。

ほんと痒みがなければ血を吸ってくれてもいいんですけどね。

それでは、今日もPython学習を始めましょう!

昨日の復習

昨日は、pythonで扱うデータベースの種類などについて学習しました。

大きくリレーショナルデータベースとNoSQLの2つに分けて、さらにリレーショナルデータベースは、簡易で扱いやすいSQLiteとWordPressで使われているMySQLについて、解説しました。

NoSQLの方は、キーバリュー型、ドキュメント型、ワイドカラム型、グラフ型に分かれていて、リレーショナルデータベースがかかえる課題をクリアするために開発されたデータベースということでしたね。

詳しくは昨日の記事をごらんください

今日は、簡易で扱いやすいリレーショナルデータベースのSQLiteを学習します。

SQLiteのインストール

SQLiteを使うためのパッケージはsqlite3ですが、Pythonistaには標準ライブラリとしてインストールされています。

また、Macで使っている場合もPython2.5以上であれば、Anacondaを利用してPythonnをインストールした場合は、標準ライブラリとして使える状態になっています。

Homebrew

Python Homebrew リレーショナルデータベース SQLite

Homebrewはパッケージ管理ツールの一つで、サードパーティーのライブラリをインストールするpipと同じようなものですが、pipがPythonのライブラリに特化しているのに対して、HomebrewはMacOSを対象としていて、パッケージは/usr/local/に保存されます。

Macにデータベースなどをインストールする場合はbrewコマンドを使うことで簡単にインストールすることができるので、Homebrewを使えるようにしておきましょう。

インストールはターミナルで次のコマンドを実行します。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

途中でMacのパスワードを求めてくるので、入力してリターンキーを押せば、インストールが完了して、brewコマンドが使えるようになります。

SQLiteを使う

準備が整えば、SQLiteを使ってみましょう。

まずはデータベースを作成します。

import sqlite3


conn = sqlite3.connect('sqlite_test.db')
conn.close()

このコードを実行すれば、実行ファイルと同じ階層にsqlite_test.dbというデータベースファイルが作成されます。

Pythonista リレーショナルデータベース SQLite

ファイル操作と同様に、作成したコネクターは最後にclose()で閉じる必要があります。

次に作成したデータベースにテーブルを作ってみましょう。

テーブルを作る

テーブルを作るには、カーソルオブジェクトを作成し、そのオブジェクトにテーブルを作る作業を実行させます。

import sqlite3


conn = sqlite3.connect('sqlite_test.db')
curs = conn.cursor()

curs.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)')
conn.commit()

curs.execute('SELECT * FROM persons')
print(curs.fetchall())

curs.close()
conn.close()

4行目まではデータベースを作成したときと同じコードです。

5行目でカーソルオブジェクトを生成し、7行目でpersonsというテーブルを作成して、自動的に番号がふられる整数idと文字列のnameというフィールドを作成しています。

次の行のconn.commit()でテーブルをデータベースに書き込んでいます。

10行目はpersonsテーブルから全てのレコード(*)を選んで、11行目でprint出力した後、13行目、14行目でカーソルとコネクターを閉じています。

この時点での出力結果は、何もデータが入っていないので、空のリスト[]になります。

レコードの追加

次に用意したテーブルにレコードを追加していきましょう。

3人の名前を追加しましょう

curs.execute('INSERT INTO persons(name) values("Mark")')
curs.execute('INSERT INTO persons(name) values("Tom")')
curs.execute('INSERT INTO persons(name) values("Nancy")')
conn.commit()

最初の5行と最後の5行は変更なしなので、中の部分を記述しています。

すでにテーブルを作成しているので、ここで最初のテーブルを作成するコードを記述してしまうと、テーブルがすでに存在するということでエラーが返されますので、注意しましょう。

idは自動で振られるので、追加するのはnameフィールドだけです。

INSERT INTO テーブル名(フィールド名) values("値")

で新しいレコードが追加できます。

3人の名前を追加してconn.commit()でテーブルに保存します。

出力結果には、次のように3人の名前とidが表示されます。

Pythonista リレーショナルデータベース SQLite

値の書き換え

続いて保存されているフィールドの値を変更してみます。

はじめの5行と最後の5行はテーブルを作成した時と同じです。

今回は、MarkをMichelに変更します。

curs.execute('UPDATE persons set name = "Michel" WHERE name = "Mark"')
conn.commit()

値の変更はUPDATEを使ってWHEREで変更するフィールドの値を探してsetで更新する名前を指定します。

出力結果は次のようになり、MarkMichelに変更されているのが分かります。

Pythonista リレーショナルデータベース SQLite

レコードの削除

続いて保存されているレコードを削除してみます。

これまで同様、はじめの5行と最後の5行は同じです。

curs.execute('DELETE FROM persons WHERE name = "Michel"')
conn.commit()

personsテープルのnameフィールドからMichelを探して削除するコードになります。

このコードを実行すると、3つあったレコードのうち(1, ‘Michel’)がなくなっていることが分かります。

Pythonista リレーショナルデータベース SQLite

メモリに保存することも可能

SQLiteは簡易なデータベースなので、メモリにデータベースを保存することができます。

データベースを作成する段階で、次のようにコードを変更すれば、データベースファイルを作成せずに、メモリにデータベースを作成するので、すでにあるテーブルと同じものを作成するコードが入っていてもエラーが起こりません。

import sqlite3


#conn = sqlite3.connect('sqlite_test.db') 次の行のように変更する
conn = sqlite3.connect(':memory:')

curs = conn.cursor()

curs.execute('CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING)')

curs.execute('INSERT INTO persons(name) values("Mark")')
curs.execute('INSERT INTO persons(name) values("Tom")')
curs.execute('INSERT INTO persons(name) values("Nancy")')
curs.execute('UPDATE persons set name = "Michel" WHERE name = "Mark"')
curs.execute('DELETE FROM persons name = "Michel"')
conn.commit()

curs.execute('SELECT * FROM persons')
print(curs.fetchall())

curs.close()
conn.close()

流れとしてはデータベースを作って、テーブルを作成、3つの名前を追加した後、一人の名前を変更し、変更した名前のレコードを削除してテーブルを表示しています。

出力結果は次のようになります。

Pythonista リレーショナルデータベース SQLite

保存されたメモリのデータは、実行するたびに削除されるので、テーブルを作成するコードをいちいちコメントアウトしなくても試すことができるので、非常に便利なやり方です。

ほんの一部だけ

今日学習した内容は、SQLiteのほんの一部分の使い方です。

データベースを学習するだけなら、もっと時間をかけてSQLiteを学習する必要がありますが、Python学習がメインですので、このあたりで一旦終了しておきます。

SQLiteをさらに学習したい場合は、こちらのサイトがおすすめです。

データベースの学習が始まって、これまでなんとなくネットで調べながら実践してきたことが、ある程度どのようなことをしていたのかがわかるようになってきました。

とはいえ、学習しなければならないことが莫大に増えたことは間違いないので、、ちょっと先が思いやられます。

今は、コツコツと学習して、できることを増やしていくしかないので、亀のように少しずつ前に進んでいこうとおもいます。

それでは明日もGood Python!