先日、PythonのTkinterを使って、Linuxコマンドを検索できるGUIアプリケーション「LinCo」を作成しました。
この間tkinterでつくったLinuxコマンドリファレンスアプリのLinCo!
なかなか使い勝手よくていいかんじー!
メインPCがUbuntuだから地味に便利笑笑 pic.twitter.com/ir8VEwxp7U— かしわばゆき (@yuki_kashiwaba) 2019年6月12日
windows版のみ、ダウンロードもここからできます。
LinCo | Linuxコマンドリファレンスアプリ
Tkinterを使ったGUIアプリケーション作成を通して学んだことや、LinCoのコードについて紹介していこうと思います。
全3回構成で、今回はアプリケーションのためのDB作成について書いていこうと思います。
使用したDBはSQliteです。
もくじ
開発環境
まずは開発に使った環境から。
・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とPythonで作ったGUIアプリケーション「LinCo」をダウンロードできるようにしました!
Windows版です!
良ければつかってみてください!
証明書入れてないんで危険なアプリみたいな表示が出ます笑https://t.co/F0tgjt9WIt pic.twitter.com/MZ8eOSam7g— かしわばゆき (@yuki_kashiwaba) 2019年7月9日
Tkinter側のコードについては次の記事でまとめたいと思います。