見出し画像

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コードを説明します。

いいなと思ったら応援しよう!

POEPOE
どうぞコーヒー一杯分のチップを頂けると嬉しいです。あなたのおかげで、より良いコンテンツを提供できるように頑張ります!