2023-12-17

PostgreSQL に接続 ~ PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

当ブログで AlmaLinux に PostgreSQL のサーバを設定した記事をノートにまとめました [1]。その記事に関連して、PySide6 で PostgreSQL サーバーのデータにアクセスする GUI サンプルを作りました。

今回のテーマ

PySide6 の 機能を利用して、PostgreSQL サーバーにある指定したデータベースにアクセスして、適当なサイズのテーブルの内容をすべて読み込んで表示します。

わざわざ「PySide6 の 機能を利用して」と書いているのは、GUI だけでなく、データベースへのアクセスも PySide6 / Qt6 の機能を利用するということを意図しています。

下記の OS 環境で動作確認をしています。

Fedora Workstation 39 x86_64
Python 3.11.6
PySide6 6.6.1
pandas 2.1.3
(libpq-15.3-1.fc39.x86_64)
AlmaLinux 9.3 (192.168.0.34) x86_64
PostgreSQL (server) 15.3

サンプルの説明

単純なサンプルですが、動作の流れを説明します。

サンプル qt_postgres.py を起動すると下記のようなウィンドウが表示されます。

ウィンドウ左上のアイコンをクリックすると、データベースへ接続するのに必要な情報を入力するダイアログが表示されます。

ホスト名(あるいは IP アドレス)、データベース名、テーブル名、そしてデータベースにアクセスするためのユーザー名とそのパスワードを入力して、 OK ボタンをクリックします。

データベースへのアクセスに成功すると、下記のようにテーブルの全内容が表示されます。

このデータは、参考サイト [2] から「東証上場銘柄一覧」の Excel ファイルをダウンロードして、必要な情報だけをテーブル (ticker) にまとめたものです。データ量は 3,827 行(レコード)× 11 カラムです。

他のテーブルで検証していないので保証はできないのですが、テーブルの構成に依存しないようにサンプルを作っています。

ただ、単純にすべてのデータを読み込むだけのサンプルですので、何万行もあるようなテーブルを読み込むと、GUI が表示のためにメモリを消費し尽す可能性があります。ほどほどのサイズのテーブルを読み込むようにしてください。

このサンプルでは、データベースにアクセス後、下記の SQL を発行して、対象のテーブルのカラム名を確認しています。info['table'] はテーブル名(この場合 ticker)をあらわす文字列です。

sql = """
    SELECT column_name
    FROM information_schema.columns
    WHERE table_name = '%s';
""" % info['table']

次に、下記の SQL を発行してテーブルの全内容を読み込んでいます。

sql = 'SELECT * FROM %s;' % info['table']

データベースにアクセスするクエリは QSqlQuery クラスのインスタンスを利用しています。

読み込んだ内容は、あらかじめカラム名のリストから辞書を作って、カラムのデータリストとして一時保存しておき、Pandas のデータフレームに変換した後 QTableView のモデルに渡して表示しています。

このサンプルの用途では、データベースのテーブルの内容をわざわざ Pandas のデータフレームに変換する必要はありません。しかし、現実にはデータ解析をする関係で、Pandas のデータフレームにしておいた方が都合が良いので、敢えてデータフレームに変換しています。そのため、QTableView のモデルも Pandas のデータフレームを表示することを前提としています。

サンプルスクリプト

サンプルは前述したような単純な機能で、しかもエラーチェックをしていない代物ですが、それでも結構な行数になってしまいました。そこで今回は下記の4つにサンプルを分けました。サンプルを試す場合は同じディレクトリに4つのファイルを保存して、qt_postgres.py を実行してください。

もちろん、確認のためには PostgreSQL 上に読み込むためのデータベースとテーブルが存在している必要があります。

  • qt_postgres.py
  • qt_postgres_dialog.py
  • qt_postgres_funcs.py
  • qt_postgres_model.py

qt_postgres.py は、サンプルのメインプログラムで主に GUI の作成しています。

qt_postgres.py

qt_postgres_dialog.py は、データベースへアクセスするための情報を入力するダイアログ部分のクラスを記載しています。

qt_postgres_dialog.py

qt_postgres_funcs.py は、主に SQL クエリの処理をしています。

qt_postgres_funcs.py

qt_postgres_model.py は、Pandas のデータフレームを QTableView クラスのインスタンス上に表示するためのモデルを実装しています。

qt_postgres_model.py

参考サイト

  1. bitWalk's: [AlmaLinux 9] PostgreSQL の設定 [2023-12-13]
  2. その他統計資料 | 日本取引所グループ

 

Qt の正式な呼称「キュート」を使っていませんが、丁寧な説明です。

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

0 件のコメント: