【Python】SQLiteからデータを取得して表示する(その1)
おはようございます。
今回は、もうお決まりとなりました
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」にアクセスします。
無事にリストボックスにデータが表示されました。
まとめ
クラス、メソッドの書き方やコメントの書式、その他もろもろと久しぶりにまったく知らない言語なので思ったよりも時間がかかりますね。
ただやっぱり新しい言語なんかやり始めるとわくわくします。
少しずつ色々な事をやっていきたいと思いますが、おかしな点なんかあれば遠慮なく指摘していただけるとありがたいです。
ではでは。
ディスカッション
コメント一覧
すみません。なんどやって以下のエラーがでてきてしまうのですが、どういった理由からでしょうか?
class MainHandler(tornado.web.RequestHandler):の修正の際にエラーがでてると思うのですが、お手数ですがアドバイスをいただけますと幸いです。
File “C:\Users\username\Desktop\test\server.py”, line 30, in get
su = SQLiteUtil()
NameError: name ‘SQLiteUtil’ is not defined
itopan様
いつもブログを見ていただきありがとうございます。
よろしければ、メールの方にソースを送っていただけると簡単に調べられるかもしれません。
よろしくお願いします。