SSブログ

Python CGI で SQLite を使ってみようか [プログラム三昧]このエントリーを含むはてなブックマーク#

Python CGI で来客記録をつけるでは、Pythonで記述したCGIを利用してテキストファイルに来客記録を付けました。 ただ、排他制御をしていなかったので、かなり確率は低いと思いますが、複数の来客があった場合にはファイルが破壊されてしまう可能性があります。 そこで、データベースを使ってみようと考えました。

さくらのレンタルサーバで使えるデータベースは

さくらのレンタルサーバには、いくつかのコースが設定してあります。 私が利用しているのは、一番安い「ライト」プランです。 機能比較ページを見るとわかるのですが、「ライト」プランはかなり制限があります。 それでも、データベースとして「SQLite が使える」と書いてありましたので、どうやって使うものか調べてみました。

まず、SQLiteというのは、他のデータベースと違って、常駐プロセスが存在しないらしいことがわかりました。 つまり、CGIで呼び出されたプログラムがその場でデータベース操作プロセスを立ち上げて使用するようです。 データベースは、ファイルに存在します。 もっと調べると、FirefoxでもSQLiteデータベースを使っているらしいこともわかりました。 へ~、知らんかった。

さくらインターネットが、「データベース使えます」とうたっているので、「どうやって使うんですか?」と聞いたところ、「Perlのモジュールがあります。使い方は、勝手に調べてね。」という返事がありました。 Perlですか。

意地でもPythonで使っちゃる

そこでPythonSQLiteを使う話題を探してみました。 どうも、pysqliteというモジュールが存在していて、Pythonバージョン2.5以降では標準装備されているようです。 ところが、レンタルサーバには、Python2.4.5がインストールされています。 しかも、「ライト」プランでは、telnetsshの使用が許可されていないので、モジュールをインストールすることもできません。 困ったな。

そんな時、こんな記事を見つけました。

さくらのレンタルサーバーの sqlite3 のバージョンを確認

この記事によると、さくらのレンタルサーバには、"/usr/local/bin/sqlite3"にSQLiteの実行ファイルが存在していて、インタラクティブに使えるようです。 では、ひとつCGIに実行させてみよう。

print os.system("/usr/local/bin/sqlite3 -help 2>&1").read()

これをPythonで書いたCGIファイルに埋め込むと実行結果が返ってきました。

Usage: /usr/local/bin/sqlite3 [OPTIONS] FILENAME [SQL]
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -init filename       read/process named file
   -echo                print commands before execution
   -[no]header          turn headers on or off
   -bail                stop after hitting an error
   -interactive         force interactive I/O
   -batch               force batch I/O
   -column              set output mode to 'column'
   -csv                 set output mode to 'csv'
   -html                set output mode to HTML
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -separator 'x'       set output field separator (|)
   -nullvalue 'text'    set text string for NULL values
   -version             show SQLite version

なんだ、SQLを与える事ができるんだったら、自分でQUERYを書いちゃえばいいんだ。 と、いうわけで、この記事ではPythonのモジュールを使わずにコマンドを使ってデータベースを使います。 「じゃあ、Pythonでなくても、いいじゃん。」というのは、言いっこなし。

CGIでデータベースを構築する

来客記録システムでは、あらかじめデータベースを構築しておいて、CGIで来客記録を追加していきます。 とはいっても、「ライト」プランでは、telnetが使えないので、データベースを構築するためのコマンドを打つことも出来ません。 仕方が無いので、データベースの構築もCGIを介して行います。

#!/usr/local/bin/python
# $Id: visitor_db_init.cgi,v 1.2 2009/02/24 13:19:57 noritan Exp $

import sys
import os

db_file = "visitor.sqlite"
table_name = "visitor"
sql = "CREATE TABLE %s (time NUMBER, description TEXT)" % table_name
command = "/usr/local/bin/sqlite3 %s \"%s\"" % (db_file, sql)

# Show error as a page description.
sys.stderr = sys.stdout

# Execute command
print """Content-type: text/plain

STATUS=%s
""" % (os.system(command))

データベースには、テーブル(visitor)を一つ作ります。 一つ目のカラム(time)には、来訪時刻を秒数で表した数値を入れます。 テーブルのソーティングに使います。 二つ目のカラム(description)には、一覧表の内容を入れます。 今の所は、来訪時刻を示す文字列を入れる入れる予定しかありません。

実行すると、「STATUS=0」が表示され、正常に実行されたことがわかります。 来客記録システムの運用中は、このファイルがうっかり実行されないように鍵をかけてしまっておきましょう。

CGIでデータベースに来客記録をつける

WS000244.png

出来上がったデータベースに来客を記録していくCGIを作成します。 やることは、ファイルに書いていた時とおなじです。 来客時刻をデータベースに追加して、データベース全体をHTML文書のテーブルとして表示します。

#!/usr/local/bin/python
# $Id: visitor_world2.cgi,v 1.2 2009/02/24 13:35:32 noritan Exp $

import os
import sys
import time

db_file = "visitor.sqlite"
table_name = "visitor"
command = "/usr/local/bin/sqlite3 %s" % (db_file)

# Show error as a page description.
sys.stderr = sys.stdout

# Get Current time
now = time.time()
asctime = time.strftime("%Y-%m-%d (%A) %H:%M:%S", time.localtime(now))

# Show header
print """Content-type: text/html

<html>
<head>
<title>VISITOR WORLD 2</title>
</head>
<body>
<h1>VISITOR WORLD 2</h1>
"""

# Append a record of this visit
(pipe_out, pipe_in) = os.popen2(command)
pipe_out.write(
"""INSERT INTO %(table)s VALUES (%(now)d, "%(asctime)s");
SELECT description FROM %(table)s ORDER BY time DESC;""" \
 % {"table":table_name, "now":now, "asctime":asctime}
)
pipe_out.close()

# Show a list of visitor record
print """<table border="1" cellpadding="3">
"""

# Make a table contents
try:
    for line in pipe_in:
        print "<tr><td>%s</td></tr>\n" % line
finally:
    pipe_in.close()


# Show footer
print """
</table>
</body>
</html>
"""

CGIの中では、SQLiteは、一回しか呼び出していません。 その一回の呼び出しの中で来客記録の追加()INSERTとテーブルの書き出し(SELECT)の二つのSQL文を連続して処理しています。 また、テーブルは、SQL文で新しい順にソーティングしているので、新たな記録は表の上に追加されています。

参考サイト

さくらのレンタルサーバ
レンタルサーバは、様々なプランがありますので、用途とお財布によって使い分けることが出来ます。
SQLite
データベースのソフトウェアは、ここからダウンロードできます。 今回は、レンタルサーバ上のプログラムを使用しているので、何もダウンロードしていません。
pydoc.org: Python Documentation Online
Pythonのオンライン・マニュアルは、ここから参照できます。 まだ、使い慣れておりません。
Python
Pythonは、ここで入手できますが、GUIなどは付いてきません。
VISITOR WORLD 2
今回のプログラムの動作は、ここから見ることができます。

参考文献

Learning Python (Learning)

Learning Python (Learning)

  • 作者: Mark Lutz
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2007/10
  • メディア: ペーパーバック
Python Cookbook (Cookbook)

Python Cookbook (Cookbook)

  • 作者:
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2005/05/05
  • メディア: ペーパーバック

nice!(0)  コメント(3)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 3

まーくん(レンタルサーバー研究者)

こんにちわ。まーくんです
サクラレンタルサーバーはいいですね
またきます
by まーくん(レンタルサーバー研究者) (2009-03-10 21:19) 

noritan

まーくん、はじめまして。
また、おいでください。
by noritan (2009-03-14 06:22) 

レンタルサーバー比較管理人@タカ

どうも、タカです。
記事読ませていただきました。

さくらサーバーではSQliteが利用できるので、
私としてはお勧めしていますが、
さくらさんは、データベースに関するサポートは、
一切○投げですので^^

自分で調べて自己責任で出来る方には、
いいでしょうね。

それにしても、CGIでSQliteを使うとは、、、
凄いですね。過程が参考になりました。
by レンタルサーバー比較管理人@タカ (2010-03-07 14:57) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。