from 初めてのSQL import *
データベース = 'データベース.db'
橋 = プログラムとの間に橋を架ける(データベース)
スタッフ = 橋.を渡ってデータベースのスタッフを呼んでくる()
スタッフ.に指示を与える('CREATE TABLE items(id INTEGER PRIMARY KEY AUTOINCREMENT, name STRING, price INTEGER)')
橋.に向かってGOサインを出す()
橋.をぶっ壊す()
こんな感じのプログラムでデータベースへの接続からSQLの実行、接続の切断ができたらわかりやすくないでしょうか。
尚、データベースへの接続については、「プログラム(あるいはユーザ)とデータベースの間に橋を架けるんだよ~」という例え話を用いております。
我々とデータベースの間には元々大きな運河が流れているせいで、そのままではデータベースにあれこれ指示を出すことができない。
だから橋を架ける必要があるんだよ。
また、指示を出した後は橋を撤去するのが鉄則。
橋がいつまでも掛ったままだと、
- 他の人が同じデータベースへ橋を架けたいときに、スペースが足りないせいで架けられない
- データベースからしてみれば、いつ命令されるかわからなくて精神的に大きな負担
など、いいことないよね、
とでも説けば、コネクションの考え方を大まかに教えられるのではないでしょうか。
また、カーソルを「データベースに勤める営業マン」に例えています。
こうすることで、「コネクションからカーソルを取得する」ことを、
我々とデータベースとの間に橋を架けたから、データベースの営業マンに来てもらうんだよ。
この営業マンに指示を与えることで、データベースを操作できるっていうわけだ。
と説明できるでしょう。
また、橋.に向かってGOサインを出す()というのは、コミットを行うためのものです。
こうすることで、
指示の内容によっては、営業マンに伝えてもデータベースはすぐにその指示を実行してくれないんだ。
慎重を期す必要があったりするからね。
この場合、橋に向かって合図を送ることで、「御社の営業マンに伝えた指示を、実行してください」って、もう一回言わなければいけないんだ。
などと、コミットの概念を説明することができます。
import sqlite3
def プログラムとの間に橋を架ける(データベース):
# 「プログラムとデータベースの間に橋を架ける」という例え話は
return 橋Type(sqlite3.connect(データベース))
# 実際にはデータベースへ接続し、「接続オブジェクト」を取得することを意味しています。
class 橋Type:
def __init__(self, conn):
self.__conn = conn
def を渡ってデータベースのスタッフを呼んでくる(橋):
# 「橋を渡ってデータベースのスタッフを呼んでくる」という例え話は
return スタッフType(橋.__conn.cursor())
# 実際には接続オブジェクトから「カーソル」と呼ばれるオブジェクトを取得することを意味しています。
def をぶっ壊す(橋):
# 「橋をぶっ壊す」という例え話は
橋.__conn.close()
# 実際には接続を切断することを意味しています。
def に向かってGOサインを出す(橋):
# 「橋に向かってGOサインを出す」という例え話は
橋.__conn.commit()
# 実際には「データベースにコミット命令を送るために接続オブジェクトにその手続きを行わせること」を意味しています。
class スタッフType:
def __init__(self, cur):
self.__cur = cur
def に指示を与える(スタッフ, 指示):
# 「スタッフに指示を与える」という例え話は
return スタッフ.__cur.execute(指示)
# 実際には「データベースへSQL文を送るためにカーソルにその手続きを行わせること」ことを意味しています。
def が結果を報告する(スタッフ):
return list(スタッフ.__cur)