このブログを検索

2020/02/16

psycopg2 検索cgi

DBといえば検索だよね。

私は何かを探す場合はほとんどシーケンシャル処理で正規表現でさがす。
あつかうデータがいろいろでフォーマットも不明な場合が多いからだ。
でもDBがあるなら、キーで検索すれば瞬時に見つかる。


検索フォーム
<!DOCTYPE html>
<html>
<head>
<title>dbq</title>
</head>
<body>
<form action="/cgi-bin/dbq.py" method="POST">
  <input type="text" name="text" value="id" />
  <input type="submit" name="submit" />
</form>
</body>
</html>
検索cgi

dbq.py


#!/usr/bin/python

import cgi
import psycopg2
import psycopg2.extras
import os

path = "localhost"
port = "5432"
dbname = "monqy"
user = "postgres"
password = "hogehoge"

pg_params = "host={} port={} dbname={} user={} password={}"
pg_params = pg_params.format(path,port,dbname,user,password)

connection = psycopg2.connect(pg_params)
cur = connection.cursor(cursor_factory=psycopg2.extras.DictCursor)

html_body = """
<!DOCTYPE html>
<html>
<head>
<title>your query</title>
<style>
h1 {
font-size: 3em;
}
</style>
</head>
<body>
<h1>%s</h1>
</body>
</html>
"""

form = cgi.FieldStorage()
qtext = form.getvalue('text','')

cur.execute('SELECT * FROM Users WHERE id = %s', (qtext,))

results = cur.fetchone()

if results is None:
        text = "not found"
else:
        text = results['name']

cur.close
connection.close

print(html_body % (text))

テーブル users から、idというフィールドが検索文字列と一致するレコードを探し、
一致しなければ「not found」、一致すればそのレコードの name フィールドを表示する。

単純な動作なのでフォームや実行結果を表示するまでもないでしょう。

このテーブルはid がkeyであり重複するレコードはないので fetchoneを使っている。

「レコードが見つからない場合」をどう書くのか、少し探した。
見つからない場合に results をそのまま表示すると「None」となることはわかったのだが、
results eq None
とか
results == "None"
ではダメで、
正しくは
results is None
であった。