1
0

More than 3 years have passed since last update.

Python3(CGI)、SQLite3で表が存在しているか調べる

Last updated at Posted at 2021-05-05

はじめに

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を出力します。

動作結果としては、次のようになります。

  • 表が存在していた場合
    exist.png

  • 表が存在しない場合
    not_exist.png

なお、このコードを実行すると、そのファイルと同じ階層にuser.dbというファイルが生成されます。
単にテストをするだけなら、このファイルを削除すると表を削除できます。

そのほか注意

作成コードにある、テーブルが存在するか確認するSQL文で、次のように記述するとSQL構文エラーとなります。

# 表が存在するか
c.execute("SELECT COUNT(*) FROM sqlite_master"
              "WHERE TYPE = 'table' AND name = 'user'")

はてさて、どうしてエラーになるか分かるでしょうか。筆者はこのエラーで一度足踏みしました。

結論を申しますと、sqlite_masterWEHREの間にスペースが無いため、エラーとなります。コード上ではインデントされているので気づきにくいかもしれません。
ですので、前節に挙げたような記述をするか、sqlite_masterの後ろにスペースを1文字追加すると良いかと思います。

参考

(1) CGI(Common Gateway Interface)とは
(2) テーブルを作成する | SQLite入門
(3) Python:sqlite3【SQLite データベース】 - リファレンス メモ
(4) [Python] 複数行にわたる文字列の代入 - Qiita
(5) SQLite3でテーブル存在チェックを行う方法 | ソフトウェア開発日記

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0