データベース機能

これまで構築してきたPythonプログラムでは,サーバ側の処理は現在時刻を取得したり文字列処理をしたりするだけの単純なものであった。しかし,文献検索,商品販売,多ユーザのブログなど,本格的なWebアプリケーションを構築するためには,大量の情報を効率的に扱うデータベースが必要である。

ここでは,sqlite3というRDBMS(Relational Database Management System)を用いてデータを管理し,そのデータをPythonプログラムから扱う方法について述べる。

データベース操作の基本形

Pythonではsqlite3モジュールを用いてデータベースを操作できる。データベース操作に関わるプログラムの基本形は以下のようになる。

import csv
import sqlite3

db_path = "bookdb.db"			# データベースファイル名を指定

con = sqlite3.connect(db_path)	# データベースに接続
cur = con.cursor()				# カーソルを取得

try:
    cur.execute("SQL文")		# SQL文の実行
    
except sqlite3.Error as e:		# エラー処理
	print("Error occurred:", e.args[0])

con.commit()					# データベース更新の確定
con.close()						# データベースを閉じる

例えば,BOOKLISTテーブルからすべての行と列を取得するSQL文は,以下のようにして実行することができる。

cur.execute("SELECT * FROM BOOKLIST")

テーブルの定義

本演習では,書籍管理のデータベースを構築する。データベースの構造は以下のようなものである。

IDTITLEAUTHORPUBLISHERPRICEISBN
50初めてのAndroidEd Burnetteオライリージャパン23104873114098
52初めてのGoogle Androidプログラミング サンプルで学ぶ必須作法と基本手順ジェローム・ディマジオ日経BP社31504822283712
190コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチフランク・アブルソン日経BP社33604822284093

このようなテーブルを,本演習では以下のようなSQL文で定義するものとする。

create table BOOKLIST
	(ID int primary key,
	AUTHOR varchar(256),
	TITLE varchar(512),
	PUBLISHER varchar(256),
	PRICE int,
	ISBN char(10))

データの読み込み

上記のテーブルにデータを挿入するSQL文は以下のとおりである(値は一例)。

insert into BOOKLIST values (
	10,
	'夏目漱石',
	'坊っちゃん',
	'ABC出版',
	500,
	'1234567890')

このSQL文をPythonプログラムから実行する場合は,以下のようになる。

cur.execute('insert into BOOKLIST values (?,?,?,?,?,?);', 
	(10, '夏目漱石', '坊っちゃん', 'ABC出版', 500, '1234567890'))
すなわち,SQL文中には値の部分を?で指定しておき,?の部分に代入すべき値をタプルとして引数で渡せばよい。

本演習では,以下のCSVファイルから書籍データを読み込み,BOOKLISTテーブルに挿入することとする。

このファイルからデータをインポートして書き込むためのPythonプログラムを以下に示す。
with open('./BookList.csv', 'r') as file:		# CSVファイルをオープン
		reader = csv.reader(file)
		for line in reader:						# 一行ずつ読み込む
			# INSERT INTO文の実行
			cur.execute('insert into BOOKLIST values (?,?,?,?,?,?);', line)
ただし,csvパッケージを読み込むためのimport文が必要である。
import csv

演習課題5

上記を参考にして,BOOKLISTテーブルの定義とCSVファイルからのデータの取り込みを行うPythonプログラムを作成せよ。

データベース検索

データベース上での検索は,SQLのSELECT文を利用する。例えば,タイトルに"Java"を含み,値段が3000円未満の本の情報を得るSQL文は,

SELECT * FROM BOOKLIST WHERE TITLE LIKE '%Java%' AND PRICE < 3000
このSQL文をPythonプログラムから実行する場合は,以下のようになる。
cur.execute("select * from BOOKLIST where TITLE like ? and PRICE < ?", ('%JAVA%',3000,))
検索結果はリストとして返されるので,繰り返し文を使って検索結果を1行ずつ処理すれば良い。

上記のSQL文を実行し,検索結果を順に表示するプログラムの雛形を以下に示す。

import sqlite3

db_path = "bookdb.db"			# データベースファイル名を指定

con = sqlite3.connect(db_path)	# データベースに接続
con.row_factory = sqlite3.Row	# 属性名で値を取り出せるようにする
cur = con.cursor()				# カーソルを取得

try:
	# SQL文の実行
	cur.execute("SELECT...", (値1,値2,))
	rows = cur.fetchall()		# 検索結果をリストとして取得
	if not rows:				# リストが空のとき
		print("そんな本はありません")
	else:
		for row in rows:		# 検索結果を1つずつ処理
			print("タイトル = %s" % str(row['TITLE']))
			
except sqlite3.Error as e:		# エラー処理
	print("Error occurred:", e.args[0])

con.commit()
con.close()

演習課題6

上記を参考にして,タイトルに"Java"を含み,かつ,値段が3000円未満の本に関して,ID,TITLE, AUTHOR, PUBLISHER, PRICE, ISBNの各属性値を出力するプログラムを作成せよ。

Copyright © 2018 Hideyuki Takada