【Python】SQLiteからデータを取得して表示する(その1)

2018年3月7日Python,SQLite,開発

おはようございます。

今回は、もうお決まりとなりました
SQLiteからデータを取得して画面に表示するプログラムを書いてみました。

プログラムは前回のものを流用します。

【Python】Tornado で ローカルにWEBサーバーをたてる

Python3.6.4 には標準で SQLite を扱うライブラリが備わっているようで
インポートの記述を追加するだけで簡単に利用できてしまいます。

スポンサーリンク

画面の修正

画面のテンプレート(html)ファイルを修正します。

index.html

<!DOCTYPE html>
<html>
  <head>
    <title>{{ title }}</title>
    <link rel="stylesheet" href="{{ static_url("style.css") }}"/>
  </head>
  <body>
    <div id="container">
      <div id="main">
        <span>Hello</span><span>{{ word }}</span>
      </div>
      <div>
        <select>
          {% for item in items %}
            <option>{{ item[0] }}</option>
          {% end %}
        </select>
      </div>
    </div>
  </body>
</html>

タイトルと、「Hello World!」の「World!」部分、あとはリストボックスを追加し、項目を動的に生成するように修正します。

プログラムの修正

インポート宣言の追加

SQLiteを利用するための宣言を追加

server.py

import sqlite3
from contextlib import closing

クラスの追加

SQLite操作用クラスを追加します。

server.py

    class SQLiteUtil:
        u" SQLite 操作用クラス "
    
        def create_db(self):
            u" データベース、及び必要なテーブルを作成します. "
    
            logging.info("create database")
            with closing(sqlite3.connect("sample.db")) as conn:
    
                c = conn.cursor()
    
                # 種別テーブル
                sql = "CREATE TABLE IF NOT EXISTS MSTKIND ("
                sql += "  KIND_CD NCHAR NOT NULL"
                sql += "  , KIND_NAME NVARCHAR"
                sql += "  , primary key (KIND_CD)"
                sql += ")"
                c.execute(sql)
    
                # 猫テーブル
                sql = "CREATE TABLE IF NOT EXISTS TBLCAT ("
                sql += "  NO INT NOT NULL"
                sql += "  , NAME NVARCHAR NOT NULL"
                sql += "  , SEX NVARCHAR NOT NULL"
                sql += "  , AGE INT DEFAULT 0 NOT NULL"
                sql += "  , KIND_CD NCHAR DEFAULT 0 NOT NULL"
                sql += "  , FAVORITE NVARCHAR"
                sql += "  , primary key (NO)"
                sql += ")"
    
                c.execute(sql)
    
                c.close()
    
        def insert_initialdata(self):
            u" 各テーブルに初期データを登録します "
    
            logging.info("insert initial data")
            with closing(sqlite3.connect("sample.db")) as conn:
    
                c = conn.cursor()
    
                # 種別マスタ
                sql = "INSERT INTO MSTKIND (KIND_CD, KIND_NAME) VALUES (?,?)"
                kinds = [
                    ('01', 'キジトラ'),
                    ('02', '長毛種(不明)'),
                    ('03', 'ミケ(っぽい)'),
                    ('04', 'サビ'),
                    ('09', 'その他'),
                ]
                c.executemany(sql, kinds)
    
    
                # 猫データ
                sql = "INSERT INTO TBLCAT VALUES (?,?,?,?,?,?)"
                cats = [
                    ("1","そら","♂","6","01","犬の人形"),
                    ("2","りく","♂","5","02","人間"),
                    ("3","うみ","♀","4","03","高級ウェットフード"),
                    ("4","こうめ","♀","2","04","横取りフード"),
                ]
                c.executemany(sql, cats)
    
                c.close()
                conn.commit();
    
        def select_kind_all(self):
            u" MST種別のデータを全て取得します. "
    
            logging.info("select all kind")
            with closing(sqlite3.connect("sample.db")) as conn:
    
                c = conn.cursor()
    
                sql = "SELECT KIND_NAME FROM MSTKIND ORDER BY KIND_CD"
    
                c.execute(sql)
                return c.fetchall()

既存処理の修正

起動時にデータベースの作成やデータ登録、データ取得を行うように修正。
また、テンプレートファイルに埋め込むパラメータを渡すようにしました。

server.py

class MainHandler(tornado.web.RequestHandler):
    u" メイン処理 "

    def get(self):

        # データベース作成
        su = SQLiteUtil()
        if os.path.isfile("sample.db") != True:
            su.create_db()
            su.insert_initialdata()
        # データ取得
        items = su.select_kind_all()
        
        # パラメータを渡す
        self.render("index.html", title="Pythonサンプル", word="Python!!", items=items)

起動してみる

コマンドプロンプトを起動し、作成した「server.py」がある場所に移動し、次のコマンドを実行します。

python server.py

ブラウザで「http://localhost:8888」にアクセスします。

起動画面

無事にリストボックスにデータが表示されました。

まとめ

クラス、メソッドの書き方やコメントの書式、その他もろもろと久しぶりにまったく知らない言語なので思ったよりも時間がかかりますね。

ただやっぱり新しい言語なんかやり始めるとわくわくします。

少しずつ色々な事をやっていきたいと思いますが、おかしな点なんかあれば遠慮なく指摘していただけるとありがたいです。

ではでは。

スポンサーリンク


関連するコンテンツ

2018年3月7日Python,SQLite,開発Python,SQLite,Tornado,プログラミング

Posted by doradora