これまで構築してきた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")
本演習では,書籍管理のデータベースを構築する。データベースの構造は以下のようなものである。
ID | TITLE | AUTHOR | PUBLISHER | PRICE | ISBN |
---|---|---|---|---|---|
50 | 初めてのAndroid | Ed Burnette | オライリージャパン | 2310 | 4873114098 |
52 | 初めてのGoogle Androidプログラミング サンプルで学ぶ必須作法と基本手順 | ジェローム・ディマジオ | 日経BP社 | 3150 | 4822283712 |
190 | コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチ | フランク・アブルソン | 日経BP社 | 3360 | 4822284093 |
このようなテーブルを,本演習では以下のような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テーブルに挿入することとする。
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
上記を参考にして,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()
上記を参考にして,タイトルに"Java"を含み,かつ,値段が3000円未満の本に関して,ID,TITLE, AUTHOR, PUBLISHER, PRICE, ISBNの各属性値を出力するプログラムを作成せよ。
Copyright © 2018 Hideyuki Takada