pythonではいろいろなデータベースと接続するための共通のしくみとしてDBAPIと呼ばれる手法が用意されています。
いろいろなデータベースに接続するためのモジュールが用意されていますが、接続や通信のやり方はモジュールごとに異なります。
そこで、接続や通信の方法をある程度統一し、pythonからさまざまなデータベースを手軽に利用する目的としてDBAPIが利用されます。
個別のモジュールの使い方をしらなくてもDBAPIの利用法を知っていればpythonからデータベースを利用できるようになります。
DBAIではコネクションオブジェクトとカーソルという2つのオブジェクトを使いデータベースとの通信を行います。
コネクションオブジェクト(データべースとの接続)
データべースとの接続を行うときに使うオブジェクトです。
コネクションオブジェクトを作る関数には、引数として「接続文字列」と呼ばれる文字列を渡します。
接続文字列には接続するデータベースに関する情報を書き込みます。
どのような文字列を渡すかは接続するデータベースによって異なります。
コネクションオブジェクトを作る
SQLite用のコネクションオブジェクトを作るには、sqlite3モジュールのconnect関数を使います。
connect(database ※接続文字列)
パラメータにはデータベースの内容を保存するファイルのフルパスか相対パスを指定します。
import sqlite3
#ここではデータはファイル example.db に格納されているものとします。
conn = sqlite3.connect('example.db')
「:memory:」という文字列を指定すると、ファイルを使わずメモリ上にSQLiteデータベースを保存できます。ただし、メモリ上に保存したデータは接続を閉じてしまうと消えてしまいます。なのでテストなどの時に利用するようにします。
データベースの接続を切断するときはコネクションオブジェクトに対してcloseメソッドを使います。
import sqlite3
conn = sqlite3.connect('example.db')
#データベースを閉じる
conn.close()
カーソル(データベースとの通信)
データベースとの通信を行うためにはカーソルを作ります。
カーソルはコネクションオブジェクトのメソッドで作ります。
import sqlite3
conn = sqlite3.connect('example.db')
#Cursor オブジェクト作成
c = conn.cursor()
execute(sql ※SQL文字列)
SQL文を引数として渡し、実行します。
ただし、executeメソッドを実行しただけではデータベースの更新は行われません。
DBAPIでは複数のデータベース更新処理が重なったときに、データベースに矛盾が起きないように排他制御を行うためです。
データベースに対する更新を行うためにはコネクションオブジェクトの commitメソッドを使います。
import sqlite3
#Connection オブジェクト作成(データベースの作成)
conn = sqlite3.connect(':memory:')
#Cursor オブジェクト作成
c = conn.cursor()
#sql文。テーブル作成
sql = '''
create table stocks
(date text, trans text, symbol text, qty real, price real)
'''
c.execute(sql)
#セーブする。
conn.commit()
#データベースを閉じる
conn.close()
fetchone()
選択したデータを1行だけ取り出します。
戻り値は選択した結果を順番に格納したタプル型になります。データがない場合はNoneを返します。
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
#テーブル作成
c.execute('''create table stocks
(date text, trans text, symbol text,
qty real, price real)''')
#テーブルに値の登録
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-06','BUY2','RHAT2',100,35.15)")
#1行だけデータを取り出す
a = c.execute("SELECT * FROM stocks").fetchone()
print('Content-type: text/html; charset=UTF-8\n')
print(a)
#出力 ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
15行目でテーブルから最初の1行を取り出しています。
出力はタプルになっています。
fetchall()
選択したデータをすべて取り出します。
戻り値は選択した結果を順番に格納したタプル型を収めたリストになります。
import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
#テーブル作成
c.execute('''create table stocks
(date text, trans text, symbol text,
qty real, price real)''')
#テーブルに値の登録
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-06','BUY2','RHAT2',100,35.15)")
#データを全て取り出す
a = c.execute("SELECT * FROM stocks").fetchall()
print('Content-type: text/html; charset=UTF-8\n')
print(a)
#出力
#[('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14), ('2006-01-06', 'BUY2', 'RHAT2', 100.0, 35.15)]