Python CGI で SQLite を使ってみようか [プログラム三昧]
Python CGI で来客記録をつけるでは、Pythonで記述したCGIを利用してテキストファイルに来客記録を付けました。 ただ、排他制御をしていなかったので、かなり確率は低いと思いますが、複数の来客があった場合にはファイルが破壊されてしまう可能性があります。 そこで、データベースを使ってみようと考えました。
さくらのレンタルサーバで使えるデータベースは
さくらのレンタルサーバには、いくつかのコースが設定してあります。 私が利用しているのは、一番安い「ライト」プランです。 機能比較ページを見るとわかるのですが、「ライト」プランはかなり制限があります。 それでも、データベースとして「SQLite が使える」と書いてありましたので、どうやって使うものか調べてみました。
まず、SQLiteというのは、他のデータベースと違って、常駐プロセスが存在しないらしいことがわかりました。 つまり、CGIで呼び出されたプログラムがその場でデータベース操作プロセスを立ち上げて使用するようです。 データベースは、ファイルに存在します。 もっと調べると、FirefoxでもSQLiteデータベースを使っているらしいこともわかりました。 へ~、知らんかった。
さくらインターネットが、「データベース使えます」とうたっているので、「どうやって使うんですか?」と聞いたところ、「Perlのモジュールがあります。使い方は、勝手に調べてね。」という返事がありました。 Perlですか。
意地でもPythonで使っちゃる
そこでPythonでSQLiteを使う話題を探してみました。 どうも、pysqliteというモジュールが存在していて、Pythonバージョン2.5以降では標準装備されているようです。 ところが、レンタルサーバには、Python2.4.5がインストールされています。 しかも、「ライト」プランでは、telnetやsshの使用が許可されていないので、モジュールをインストールすることもできません。 困ったな。
そんな時、こんな記事を見つけました。
さくらのレンタルサーバーの 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でデータベースに来客記録をつける
出来上がったデータベースに来客を記録していく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
- 今回のプログラムの動作は、ここから見ることができます。
こんにちわ。まーくんです
サクラレンタルサーバーはいいですね
またきます
by まーくん(レンタルサーバー研究者) (2009-03-10 21:19)
まーくん、はじめまして。
また、おいでください。
by noritan (2009-03-14 06:22)
どうも、タカです。
記事読ませていただきました。
さくらサーバーではSQliteが利用できるので、
私としてはお勧めしていますが、
さくらさんは、データベースに関するサポートは、
一切○投げですので^^
自分で調べて自己責任で出来る方には、
いいでしょうね。
それにしても、CGIでSQliteを使うとは、、、
凄いですね。過程が参考になりました。
by レンタルサーバー比較管理人@タカ (2010-03-07 14:57)