Python

TkinterでPythonGUIアプリを作った【DB編】

先日、PythonのTkinterを使って、Linuxコマンドを検索できるGUIアプリケーション「LinCo」を作成しました。

windows版のみ、ダウンロードもここからできます。
LinCo | Linuxコマンドリファレンスアプリ

Tkinterを使ったGUIアプリケーション作成を通して学んだことや、LinCoのコードについて紹介していこうと思います。
全2回構成で、今回はアプリケーションのためのDB作成について書いていこうと思います。

使用したDBはSQliteです。

もくじ

  1. 開発環境
  2. ソースコード
  3. データをSQliteに格納する
  4. DBと接続する
  5. まとめ

開発環境

まずは開発に使った環境から。

・Python 3.7.3
・SQlite
・Tkinter

大まかな流れとしては、Pythonでスクレイピングしてきた情報をそのままDBに格納し、Tkinterで作ったアプリケーションで利用する、といった感じです。
今回はスクレイピングについては割愛しますが、Linux コマンドリファレンスよりデータを拝借しました。

ソースコード

先にソースコードの全文を貼っておきます。
細かい解説は後ろの項でやります。

import sqlite3
from contextlib import closing

def main():
    def insert_db():
        insert_sql = 'insert into commandtbl (command, mean, category) values (?,?,?)'
        cm_taples = [
			('ls', 'ディレクトリ内の要素を表示する', 'ディレクトリ'),
			

		####以下各種コマンドのデータ####


        ]
        c.executemany(insert_sql, cm_taples)
        conn.commit()

    def create_table():
        # executeメソッドでSQL文を実行する
        create_table = '''create table commandtbl (command varchar(20) PRIMARY KEY, mean varchar(200), category varchar(20))'''
        c.execute(create_table)
        create_table = '''create table optiontbl (command varchar(20), option varchar(20), mean varchar(200), FOREIGN KEY (command) references commandtbl(command))'''
        c.execute(create_table)
            
    db = 'lcommands'
    with closing(sqlite3.connect(db)) as conn:
        c = conn.cursor()
        create_table()
        insert_db()
        conn.commit()
        insert_db_option()
        conn.commit()

if __name__ ==  '__main__':
    main()

データをSQliteに格納する

DBにPythonでデータを格納する方法は複数ありますが、今回はタプルに格納されたデータをSQliteに格納する方式です。

具体的には、

('ls', 'ディレクトリ内の要素を表示する', 'ディレクトリ'),

というタプルが、DBの一つの行に対応していると考え、左から、”コマンド”、”説明”、”カテゴリー”という列に格納されていくイメージです。

このタプルを、

sql = 'insert into commandtbl (command, action, fruq, example) values (?,?,?,?)'

というコードで処理することで、SQLにデータを格納するためのSQL文が生成されます。

最終的にはこちらのSQL文を、接続済みのDBにコミットすることで、データが格納されるという仕組みです。

全体的な処理の流れとしては、

1.タプルからSQL文を生成
2.DBに接続
3.データを格納
4.DB切断

という感じで非常にシンプルです。

DBと接続する

db = 'lcommands'
with closing(sqlite3.connect(db)) as conn:
	c = conn.cursor()
	create_table()
	insert_db()
	conn.commit()
	insert_db_option()
	conn.commit()

この部分でDBとの接続を行っています。
with closing()は、処理の終了とともに自動でDBとのコネクションを切ってくれる便利メソッドです

もちろん接続と切断を明示的にしてもいいのですが、切断し忘れによるバグを防ぐ意味で、使っておくのが無難だと思います。

さて、DBに接続がうまくいったら、あとは各関数でDBを操作しています。

conn.commit()をしないとDBに対しての操作が反映されないので注意しましょう。

まとめ

非常にざっくりとではありますが、Tkinterで作ったアプリケーションのDB側のコードについてまとめました。
使用感はこんな感じ笑

Tkinter側のコードについては次の記事でまとめたいと思います。