$6 データの検索

6-1 データの検索

ここでは、初歩的なデータ検索について説明します。 基本的には、if文で パターンマッチ、数値の比較による検索を説明します。

HTMLのフォーム、データ(またまたスーパーカー)は、Perlの場合と同じとします。 また、フォームからのデータの読み込みは済んでいて、
FmMakerにフォームのMAKERのVALUE、FmEngineにフォームのENGINEのVALUEが入っていて、 クルマのデータは配列LinesCに一行づつ入っているとします。

プログラムの流れは、以下のようになります

これをそのままプログラムにしてみましょう。

  1: for LineC in LinesC:
  2:   [Key, Name, Engine, Power, Speed] = string.split (LineC, '\t')
  3:   Engine = int(Engine)
  4: 
  5:   if FmMaker == "AL" or FmMaker == Key:
  6:     if (FmEngine == '0' or 
  7:        (FmEngine == '1' and Engine <= 1999) or 
  8:        (FmEngine == '2' and 2000 <= Engine <= 2999) or 
  9:        (FmEngine == '3' and 3000 <= Engine <= 3999) or 
 10:        (FmEngine == '4' and 4000 <= Engine) ):
 11:        #条件に合った場
 12:          TLine = '<TR><TD><A HREF="%s">%s</A></TD><TD>' % (MakerName[Key], MakerURL[Key]) + \
 13:                  '%s</TD><TD>%s</TD><TD>%s</TD><TD><B>%s</B></TD></TR>\n' % (Name, Engine, Power, Speed)
 14:          Table = Table + TLine

Pythonの場合は「a <x <b」という比較の書き方ができます。 一方、この数値の比較のために、3行目で、Engineを数値型に変換します。 また、フォームのデータを切り分けられた FmEngine は文字型なので、 「FmEngine == '0'」と、クォートで囲って文字型として比較します。

Perl編で説明した、もう少し効率の良い方法は、次のようになります。

  1: for LineC in LinesC:
  2:   if FmMaker == "AL" or FmMaker == LineC[0:2]:
  3:     [Key, Name, Engine, Power, Speed] = string.split (LineC, '\t')
  4:     if FmEngine == "0" or FmEngine == Engine[0]:
  5:       #条件に合った場合
  6:          TLine = '<TR><TD><A HREF="%s">%s</A></TD><TD>' % (MakerName[Key], MakerURL[Key]) + \
  7:                  '%s</TD><TD>%s</TD><TD>%s</TD><TD><B>%s</B></TD></TR>\n' % (Name, Engine, Power, Speed)
  8:          Table = Table + TLine

文字列の一部分だけを取り出すには、「LineC[0:2]」「Engine[0]」という表現で簡単にできます。 今回は、Engineは文字列型のままになります。

CGI全体の例はつくりませんが、検索結果をカウントする場合の注意点で、 Pythonには「i++」という演算はないので「i = i + 1」と書くしかありません。
注意:「i += 1」という書き方は、Python1.5.2ではエラーになりますが、 Python2.0ではうまく出来ます。


Previous: 5-3 簡単なリレーショナルデータベース

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net