データベースを利用したウェブサイトの構築

Image from Gyazo

SQLiteを利用したウェブサイト

SQLiteなどデータベース管理システムの多くは, C,C++,Perl,Ruby,Pythonなど様々なプログラミング言語で利用するためのライブラリ(またはAPI) が公開されています. ライブラリを導入することで,プログラムを介したレコードの追加・削除などの操作が可能となります. 今回は,Pythonのウェブサーバ機能を用いて,ウェブサイトでSQLiteのデータベースを操作するCGI(Common Gateway Interface)を実装することを目的とします.

Pythonのインストール

Windowsの場合

Windows版は,公式サイトからダウンロードしましょう. ここでは,ダウンロードするパッケージとして,embeddable zip file を選択するようにしてください.

Windows版 Pythonのダウンロード

MacOSの場合

MacOSでは,バージョン管理が容易な pyenv をインストールすると良いでしょう. pyenv のインストールはHomeBrewを利用します.

% brew install pyenv

pyenv をインストールしたら,利用可能なPythonのバージョンを調べます. ここでは,最新の3.8.0をインストールします(2020年1月21日時点).

% pyenv install --list
% pyenv install 3.8.0

ソースファイルのダウンロード

SQLiteを利用するためのPythonのソースファイルはGitHubで公開しています. 下記のプロジェクトページで, Download ZIP をクリックし,ダウンロードしたファイルを展開してください.

naoto-github/WebSQLite

データベースの確認

展開したフォルダにある db/students.db が今回利用するデータベース・ファイルです. sqlite3コマンドを用いて,データベースの内容を確認しておきましょう. データベースには,テーブル students が存在し,4件のレコードが登録されています. 各レコードは,idnamegrade という3つの属性で構成され,id が主キーです.

% sqlite3 students.db
sqlite> .table
students
qlite> .header on
sqlite> select * from students;
id|name|grade
A001|Iwashiro Hayato|2
A002|Iwamura Yuu|1
B003|Sugie Hiroko|3
C004|Senba Asuka|1
id name grade
A001 Iwashiro Hayato 2
A002 Iwamura Yuu 1
B003 Sugie Hiroko 3
C004 Senba Asuka 1

【students】

ウェブサーバの起動

Pythonのウェブサーバ機能(http.server)を利用します. ウェブサーバの設定は server.py に記述されています. CGIの設置ディレクトリ,ポート番号,IPアドレスなどの設定をしています.

from http.server import HTTPServer, CGIHTTPRequestHandler

class Handler(CGIHTTPRequestHandler):
    # CGIを設置するディレクトリ
    cgi_directories = ["/cgi-bin"]

# ポート番号
PORT = 8080

# IPアドレス
HOST = "127.0.0.1"

print("http://localhost:8080/cgi-bin/sql.py")
print("http://localhost:8080/cgi-bin/sql.py?id=A001")

# サーバの起動
httpd = HTTPServer((HOST, PORT), Handler)
httpd.serve_forever()

それでは,server.py を実行してみましょう.

% python server.py
http://localhost:8080/cgi-bin/sql.py
http://localhost:8080/cgi-bin/sql.py?id=A001

実行したらブラウザでhttp://localhost:8080/を開きます. 下記のように表示されれば,サーバは正しく動作しています.

Image from Gyazo

データベースの表示

PythonのSQLiteライブラリを利用して,データベース(students.db)を表示します. Pythonのバージョン3以降は標準でSQLiteのライブラリが導入されています. データベースの操作は cgi-bin/sql.py に記述されています.

#! /anaconda3/bin/python

import sqlite3
import cgi

print ("Content-type:text/html\n\n")
print ("<html>")
print ("<body>")
print("<h1>SQLite on Web</h1>")

# データベース・ファイル
DB_FILE = "db/students.db"

# データベースへの接続
connection = sqlite3.connect(DB_FILE)

# カーソルの取得
cursor = connection.cursor()

# フォームの取得
form = cgi.FieldStorage()

# SQL文の開始
sql = "select * from students"

# IDによる検索
if "id" in form:
    sql += " where id=\"" + form["id"].value + "\""

# SQL文の終了
sql += ";"

# SQLの実行
print("<h3>SQL: " + sql + "</h3>")
for record in cursor.execute(sql):
    print("<p>" + str(record) + "</r>")

print ("</body>")
print ("</html>")

CGIを実行するには,Pythonの実行ファイルのパスを設定する必要があります. 一行目の #! の後に,環境に合わせたパスを記述してください.

#! /anaconda3/bin/python

設定したらブラウザでhttp://localhost:8080/cgi-bin/sql.pyを開きます. 下記のように表示されれば,CGIは正しく動作しています.

Image from Gyazo

データベースの検索

条件を指定してデータベースから目的のレコードを検索してみましょう. CGIに条件となるデータを渡すには GETメソッド を用います. GETメソッドでは,URLの最後に ? を記述し,キー・バリューの組み合わせてデータを指定します(クエストリング). ここでは,主キーである id を条件に用いて検索してみます.

http://localhost:8080/?key=value

ここでは,idA001 となっているレコードを検索するため, ブラウザでhttp://localhost:8080/cgi-bin/sql.py?id=A001 を開きます. 下記のように表示されれば,CGIは正しく動作しています.

Image from Gyazo

例題

sql.pyを修正し,下記の機能を追加しなさい.

  • 検索結果を表形式(tableタグ)で表示
  • gradeで検索
  • nameを正規表現で検索

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.