When it’s ready.

出来るまで出来ない

こつこつCGIサーバー

とあるDBの中身をブラウザ上に適当に表示などしたいと思った。
Pythonでやれば、簡単に出来るんじゃないかと適当にやってみた。

環境

  • Python
    • 2.5.1
    • sqlObject
    • MySQLdb
  • DB
    • MySQL5.0.23

[python] やり方?

djangoで作れれば簡単ポインだが、既に存在するテーブルをモデル化する方法が分からないのと、適当にやってみて壊してしまったら怖いので今回はパス。

sqlobjectで、DBにアクセスしてデータを持ってくる事にする。スクリプトを、手で叩くのではなく、ブラウザでアクセスが有った際にデータを取得したいので、CGIHTTPServerを使うことにした。
>cgiserver.py

# coding:utf8
import CGIHTTPServer
CGIHTTPServer.test()

簡単すぎる! 3行でOK
cgiserver.pyと同じディレクトリにcgi-binというフォルダを作成し、pyファイルを作成した。

>dbone.py

#! /usr/bin/env python
# coding:utf-8
import cgi
from datetime import datetime
from DBmngETestHeader import *

html_body = u"""
<html><head>
<meta http-eqiv="content-type" content="text/html";charset=utf-8">
</head>
<body>

<a href='./DBone.py/?query=1'>一覧</a><br>

<hr>
<h1>%s</h1>
<hr>
<a href='/'>もどりっ!</a><p>
%s
</body>
"""

content = ''

form=cgi.FieldStorage()
query_str=form.getvalue('query','')
if not query_str.isdigit():
    title=u'一覧 取得失敗<p>'
else:
    title=u'一覧になりまする<p>'
    for i in getAnswererIdInfo():
        #print i
        content += "%s : %s <br>"%(i[0], i[1])

#print "Content-type: text/html;charset=utf-8\n"
print (html_body%(title,content)).encode('utf-8')

>DBctrl.py

#! /usr/bin/env python
# coding:utf-8
from DBmngETestHeader import *
blockinfo = [[1, 20], [21, 25], [41, 60], [61, 80], [81, 100] ]

# 全員を取得する。
def getBlockAns(blockID):
    """
    >>> getBlockAns(1)
    [{1:[1,...]}...]
    """
    "ブロックを調査"
    qidinfo = blockinfo[blockID]
    return_hash = {}

    "求めたqid、からbtnid、ansidを求める"
    for p in range(1,10):
        one_arr = []
        for q in range(qidinfo[0], qidinfo[1]+1):
            r = StudioAns.selectBy(qid = q, btnid=p)
            r = list(r)
            r = str(r)
            r = r.split("ansidID=")
            one_arr.append(int(r[1][:-3]))
        return_hash[p] = one_arr
    print return_hash
    

これとは別に、DBアクセス用のヘッダーファイルがある。
とりあえづ、これで動くは動くがsqlobjectの使い方がいまいちよく分からない。
2万レコードほど有る中から、1000個ほど取り出すのに1.4秒くらい掛かってる
そんなにかかるもんなのか?0.2秒くらいになって欲しい。