データベースを利用したウェブサイトの構築
SQLiteを利用したウェブサイト
SQLiteなどデータベース管理システムの多くは, C,C++,Perl,Ruby,Pythonなど様々なプログラミング言語で利用するためのライブラリ(またはAPI) が公開されています. ライブラリを導入することで,プログラムを介したレコードの追加・削除などの操作が可能となります. 今回は,Pythonのウェブサーバ機能を用いて,ウェブサイトでSQLiteのデータベースを操作するCGI(Common Gateway Interface)を実装することを目的とします.
Pythonのインストール
Windowsの場合
Windows版は,公式サイトからダウンロードしましょう. ここでは,ダウンロードするパッケージとして,embeddable zip file を選択するようにしてください.
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 をクリックし,ダウンロードしたファイルを展開してください.
データベースの確認
展開したフォルダにある db/students.db が今回利用するデータベース・ファイルです.
sqlite3
コマンドを用いて,データベースの内容を確認しておきましょう.
データベースには,テーブル students が存在し,4件のレコードが登録されています.
各レコードは,id,name,grade という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/を開きます. 下記のように表示されれば,サーバは正しく動作しています.
データベースの表示
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は正しく動作しています.
データベースの検索
条件を指定してデータベースから目的のレコードを検索してみましょう. CGIに条件となるデータを渡すには GETメソッド を用います. GETメソッドでは,URLの最後に ? を記述し,キー・バリューの組み合わせてデータを指定します(クエストリング). ここでは,主キーである id を条件に用いて検索してみます.
http://localhost:8080/?key=value
ここでは,id が A001 となっているレコードを検索するため, ブラウザでhttp://localhost:8080/cgi-bin/sql.py?id=A001 を開きます. 下記のように表示されれば,CGIは正しく動作しています.
例題
sql.pyを修正し,下記の機能を追加しなさい.
- 検索結果を表形式(tableタグ)で表示
- gradeで検索
- nameを正規表現で検索