はじめに
Pythonは2.5よりSQLite3を標準でサポートしており、基本的なSQL文を使ってデータを操作できます。
また、CGIとはクライアント側のWebブラウザの要求に応じてWebサーバが外部プログラムを呼び出して、その実行結果がHTTPを介してクライアントのWebブラウザに送信される仕組みのことです[参考(1)]。JavaScriptと異なり、サーバ側で処理を行うのがポイントでしょうか。
当記事では、Pythonで書いたCGIによるWebアプリにおいて、表が存在しているかを調べる方法についてまとめています。
実行環境
以下のローカル環境で動かしました。
ApacheやPythonの導入については、他の記事などを参照してください。
Windows10
Apache 2.4.47 (Win64)
Python 3.9.4
サンプルコード
作成した「表が存在しているか調べる」コードを以下に示します。
#! C:\(中略)\Python\Python39\python
# -*- coding: utf-8 -*-
# CGI error tag
import cgitb
cgitb.enable()
# SQLite3
import sqlite3
# Standard Output HTML HEAD
print("Content-Type: text/html")
print()
# 接続。なければDBを作成する。
conn = sqlite3.connect('user.db')
# カーソルを取得
c = conn.cursor()
# テーブルが存在するか
c.execute("SELECT COUNT(*) FROM sqlite_master"
" WHERE TYPE = 'table' AND name = 'user'")
row = c.fetchone() # SQL文の実行結果をtupleで得る
if row[0] == 1: # 1なら表が存在する, 結果はtupleなので最初の要素(0番目)を参照する
print("表userは存在します" "<br />")
else: # 0(1でない)なら表は存在しない
print("表userは存在しません" "<br />")
print("表userを作成します" "<br />")
# テーブルを作成
c.execute("CREATE TABLE user(userid TEXT, username TEXT, pass TEXT)")
# Insert実行
c.execute("INSERT INTO user VALUES('U000', 'admin', 'pass')")
# コミット
conn.commit()
# 値表示処理
c.execute("SELECT * FROM user")
for row in c:
print(str(row) + "<br />")
# コネクションをクローズ
conn.close()
このコードでは、表userが存在しているか調べて、無かったら作ります(CREATE TABLE)。その後、表userを出力します。
動作結果としては、次のようになります。
なお、このコードを実行すると、そのファイルと同じ階層にuser.db
というファイルが生成されます。
単にテストをするだけなら、このファイルを削除すると表を削除できます。
そのほか注意
作成コードにある、テーブルが存在するか確認するSQL文で、次のように記述するとSQL構文エラーとなります。
# 表が存在するか
c.execute("SELECT COUNT(*) FROM sqlite_master"
"WHERE TYPE = 'table' AND name = 'user'")
はてさて、どうしてエラーになるか分かるでしょうか。筆者はこのエラーで一度足踏みしました。
結論を申しますと、sqlite_master
とWEHRE
の間にスペースが無いため、エラーとなります。コード上ではインデントされているので気づきにくいかもしれません。
ですので、前節に挙げたような記述をするか、sqlite_master
の後ろにスペースを1文字追加すると良いかと思います。
参考
(1) CGI(Common Gateway Interface)とは
(2) テーブルを作成する | SQLite入門
(3) Python:sqlite3【SQLite データベース】 - リファレンス メモ
(4) [Python] 複数行にわたる文字列の代入 - Qiita
(5) SQLite3でテーブル存在チェックを行う方法 | ソフトウェア開発日記