
Python+Qtアプリ開発日記#12
前回からのアップデート
データベースを実装する前に、前回カスタムしたツールボタンをアップデートしました。
アップデート内容
ツールボタンにメニューを付けられるようにしました。
メニューは、ツールバーに貼り付けたアイコンをメニューにも付くようにしました。
アップデートしたコード
コードの全文はGitHubに上がっているので、そちらを確認してください。
ここでは、主な変更点を示しておきます。

クラスの"__init__"に引数としてQActionのリストを受け取れるようにしました。
アイコンの引数をアイコンファイルへのファイルパス以外にQIconを受けられるようにした。
複数の型を受けられるようにしたので、引数の型をチェックして、意図しない型が来たら例外を出すようにした。
ツールボタンにメニューを追加できるようにした。
このカスタムしたツールボタンを使うと次にように外観が少し変わります。

▼の部分をクリックすると
クリックすると追加したメニューが表示されます。
公開しているコードでは、メニューを4つ追加しています。

メインウインドウ側のコードの修正は、次のとおりです。

実際に呼び出す部分では、QActionを生成してメニューが押下された場合の処理を追加しています。

メニューは4つ追加していますが、どれが押下されても1つの処理が実行されます。
追加している処理は、何が押下されたかを表示するだけです。

新たにヘルパーパッケージを作成
新しくQt用のヘルパーパッケージを追加しています。
追加したのは、QFontからフォント設定用スタイルシートを作る処理を作成して、カスタムツールボタンのメニューに適用しています。


データベース
アップデートはここまでで、データベースを追加する準備をします。
今回作っているアプリは個人で所蔵している電子データ、コンテンツを管理するアプリケーションです。
管理する、電子データ、コンテンツは録画・撮影した動画ファイルや個人で書籍をスキャンした電子書籍(自炊)を対象としています。
Pythonで扱えるデータベース
扱えるデータベースはたくさんあります。
一例を示します。
SQLite
ライブラリ: sqlite3(Pythonに付属する標準ライブラリ)
特徴: 組み込み型データベースで、サーバーが不要。軽量で簡単に使用可能。
MySQL
ライブラリ: mysql-connector-python, PyMySQL
特徴: オープンソースのリレーショナルデータベース。スケーラビリティとパフォーマンスに優れている。
PostgreSQL
ライブラリ: psycopg2, SQLAlchemy
特徴: 高機能で拡張性のあるリレーショナルデータベース。トランザクションと並行処理に優れている。
今回は、標準で使えるSQLiteを使うことにします。
SQLiteって何?
SQLite(エスキューライト)は、小型で軽量なデータベース管理システムです。データベースは、たくさんの情報を整理して保存するための特別な構造で、例えば名前や住所、電話番号などの情報を管理するのに使われます。
どうやって動くの?
SQLiteは、他の多くのデータベースと違って、特別なサーバーソフトウェアを必要としません。つまり、インストールしたり設定したりするのが簡単です。一つのファイルにすべてのデータを保存するので、持ち運びも簡単です。
どんなときに使うの?
SQLiteは、アプリケーションやデバイス内でデータを管理するのに最適です。例えば、スマホのアプリ、パソコンのプログラム、あるいは小型の組み込みシステムなどで使われます。以下のような場合に特に便利です:
小規模なプロジェクト(まさに今作っているアプリ向き)
手軽にデータベースを使いたいとき
ネットワーク接続が必要ないとき
どんなメリットがあるの?
シンプルさ:インストールや設定が簡単で、使いやすいです。
軽量:大きなリソースを必要とせず、小さなシステムでも動作します。
移植性:一つのファイルにデータを保存するので、簡単に他のデバイスに移動できます。
まとめ
SQLiteは、小型で軽量、そして使いやすいデータベース管理システムです。特別なサーバーソフトウェアを必要とせず、手軽にデータを管理したいときに非常に便利です。
そもそもデータべーすとは?
データベースとは、たくさんの情報を効率的に整理し、保存し、検索するためのシステムです。簡単に言えば、データベースはデジタルの情報の倉庫のようなものです。例えば、顧客の名前や住所、製品の価格や在庫状況など、さまざまなデータを一元的に管理できます。
今回のアプリで扱うデータの検討
SQLiteとデータベースの説明は以上とします。もっと詳しく知りたい場合はGoogle、Yahoo!などで検索してください。
今回のアプリはコンテンツの管理を行うものなので、
どんなコンテンツなのか?(種類)
どんな名前のものか?(タイトル)
だれが制作したものか?(著者、制作会社等)
だれがリリースしたものか?(個人、販売会社等)
いつリリースしたものか?(年月日)
などが、基本的に管理するデータ
それ以外に必要なデータを検討すると
データを完全に識別する情報(ID)。
データの追加した日時(年月日)。
データを更新した日時(年月日)。
コンテンツに対するコメント。
データの同一性を確認するためのデータ。
カバー画像
管理データは削除したが、履歴のように残したい場合や
用意に削除できのうような情報。
などでしょう。
これらの格納するデータを整理して、SQLiteで扱えるデータ型を割り当ててみます。

これをざっくりとSQL文で定義した場合を作ります。
※先ほどの表からだいぶデータが増えていますが気にしないでください。
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
protection INTEGER,
deletion_mark INTEGER,
title TEXT,
author TEXT,
series TEXT,
series_index TEXT,
category TEXT,
brand TEXT,
publisher TEXT,
company TEXT,
club TEXT,
description TEXT,
release_date TEXT,
price TEXT,
product_number TEXT,
jancode TEXT,
media_type TEXT,
rating TEXT,
still_width TEXT,
still_height TEXT,
video_codec_name TEXT,
video_width TEXT,
video_height TEXT,
audio_codec_name TEXT,
audio_sample_rate TEXT,
duration TEXT,
save_dir_path TEXT,
file_name TEXT,
file_hash_algorithm TEXT,
file_hash_data TEXT,
updated_at (TEXT NOT NULL DEFAULT (DATETIME('now', 'localtime'))
created_at (TEXT NOT NULL DEFAULT (DATETIME('now', 'localtime'))
実際にこのデータをデータベースで扱うには、SQL文でテーブルを生成しますが、これだけ知っていれば良いSQL文を説明しておきます。
テーブルの作成(CREATE文):データベースにテーブルを新しく作る場合に使います。
データの取得(SELECT文):データベースから特定の情報を引き出すことができます。
データの追加(INSERT文):新しい情報をデータベースに追加できます。
データの更新(UPDATE文):既存の情報を変更することができます。
データの削除(DELETE文):不要な情報をデータベースから削除できます。
データベースを扱うのに使うSQL文はこの5つを知っていれば大体扱えます。
テーブルってなに?
データベースのテーブルは、情報を整理して保存するための「表(テーブル)」のようなものです。例えば、学校のクラス名簿や、製品の在庫リストをイメージしてください。テーブルは、縦に並んだ「列(カラム)」と、横に並んだ「行(レコード)」で構成されています。
列(カラム)
列は、データの種類を示します。例えば、従業員のデータベースには「名前」、「住所」、「電話番号」といった列があります。それぞれの列は特定の情報を格納するための場所です。
行(レコード)
行は、各データのセットを示します。例えば、従業員のデータベースにおける一つの行には、ある一人の従業員の「名前」、「住所」、「電話番号」といった情報が含まれます。各行は一つの完全な情報セットを表しています。
データベースを扱うとはデータベースに格納されているテーブルを扱うことになります。
PythonでSQLiteを使うには
標準ライブラリなので
import sqlite3
でそのモジュールで使えるようになります。
データベースを扱うには、何がなくてもそのデータベースに接続してから利用します。
Pythonでも変わりません。
データベースを扱う手順
・データベースへ接続
・接続すると接続したデータベースを操作するカーサーというオブジェクトが得られる
・カーサーを使って、SQL文を実行する
・SQL文の実行結果(SELECTなら検索、抽出した結果)を取得(フェッチするともいう)する
・データベースとの接続を切る
といった流れです。
具体的なコード例
次のコード例は、データベースに指定したテーブルが存在するかをSELECT文を使って、sqlite_masterというテーブルから"self.table_name"で示されるテーブルが存在している確認しています。このテーブルはデータベース内のすべてのテーブル、インデックス、ビュー、およびトリガーに関するメタデータを保持する特別なテーブルになります。
SQLiteでは内部にどんなテーブルが存在している
"self.db_file_path"はデータベースファイルパス(SQLiteのデータベースの実体は1つのファイルです)
"self.table_name"は確認するテーブル名が入ります。
sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?;"
with sqlite3.connect(self.db_file_path) as conn:
cursor = conn.cursor()
cursor.execute(sql, (self.table_name,))
result = cursor.fetchone()
return result is not None
※テーブル名、テブルのカラムは日本語名は使わないでください、アルファベットを使います。
今回は長くなったのでここまでにします。
次回は、実際にデータベースにデータを追加したり、検索したりする具体的なPythonコードを説明します。
いいなと思ったら応援しよう!
