Panel応用編 第2回: データベースとの統合

Python
この記事は約6分で読めます。

こんにちは、JS2IIUです。Panel応用編の第2回です。応用編はおそらく10回後世になる見込みです。連続で投稿していきますので、よろしくお願いします。

はじめに

データベースとの統合は、ダッシュボードやウェブアプリケーションにおいてデータの取得、保存、操作に不可欠な要素です。本記事では、Panelを使ってデータベースと連携する方法を解説します。今回は、SQLAlchemyを用いてPostgreSQLやSQLiteなどのデータベースに接続し、データを操作する基本的な流れを学びます。また、PanelのUIコンポーネントを使用して、データベースのクエリ結果を表示する例も紹介します。

1. データベースとの接続: SQLAlchemyの使用

SQLAlchemyはPythonで最も広く使われているORM(Object-Relational Mapping)ライブラリであり、データベース操作を簡単に行うことができます。まずは、データベースに接続し、テーブルを作成する方法を見てみましょう。

事前準備

SQLAlchemyをインストールする必要があります。以下のコマンドを実行してください。

pip install sqlalchemy

次に、Panelとデータベースを統合するためのコードを記述します。

from sqlalchemy import create_engine, Column, Integer, String, MetaData, Table
from sqlalchemy.orm import sessionmaker

# データベースの設定
DATABASE_URL = "sqlite:///example.db"
engine = create_engine(DATABASE_URL)

# メタデータの初期化
metadata = MetaData()

# サンプル用テーブルの定義
users_table = Table(
    'users', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String),
    Column('age', Integer)
)

# テーブルの作成
metadata.create_all(engine)

# セッションの設定
Session = sessionmaker(bind=engine)
session = Session()
  • create_engine() はデータベース接続を作成するための関数です。この例では、SQLiteのデータベースに接続しています。DATABASE_URLの部分をPostgreSQLなどに変更すれば他のデータベースにも接続可能です。
  • MetaData() はデータベースメタデータを管理します。テーブルやカラムなどの構造がここで定義されます。
  • Table() では、テーブルの名前(ここではusers)や列を定義します。IntegerStringなどのデータ型を指定できます。
  • metadata.create_all() は、データベース内にテーブルを実際に作成するためのコマンドです。

2. データの挿入

データベースに接続できたら、次にデータを挿入する方法を見てみましょう。SQLAlchemyのセッションを使って、テーブルにデータを追加します。

from sqlalchemy import insert

# データの挿入
insert_stmt = insert(users_table).values(name='Alice', age=30)
session.execute(insert_stmt)
session.commit()
  • insert() は、テーブルにデータを挿入するための関数です。ここでは、users_tablename='Alice'age=30というデータを挿入しています。
  • session.execute() は、実際に挿入文を実行する部分です。その後、session.commit() を呼び出して変更を確定させます。

これで、データベースにデータが追加されます。

3. データのクエリ

次に、データベースからデータを取得して表示する方法を紹介します。以下のコードで、挿入したデータをクエリし、PanelのUIコンポーネントに表示します。

from sqlalchemy import select
import panel as pn

pn.extension()

# データのクエリ
query = select([users_table])
result = session.execute(query).fetchall()

# Panelの表示コンポーネント
data_pane = pn.Column(
    *[pn.pane.Markdown(f"ID: {row.id}, Name: {row.name}, Age: {row.age}") for row in result]
)

# Panelレイアウトの表示
data_pane.show()
  • select() は、データベースからデータを取得するための関数です。users_tableを対象に全ての列を選択しています。
  • session.execute() でクエリを実行し、結果をfetchall()を使ってすべて取得します。
  • pn.Column() は、Panelのレイアウトコンポーネントで、複数の要素を縦に並べます。ここでは、クエリ結果をループし、各行をMarkdownとして表示しています。

4. データの更新

既存のデータを更新する方法も簡単に実装できます。次に、名前を変更する例を見てみましょう。

from sqlalchemy import update

# データの更新
update_stmt = update(users_table).where(users_table.c.name == 'Alice').values(name='Alicia')
session.execute(update_stmt)
session.commit()
  • update() 関数を使って、name列が’Alice’の行の値を’Alicia’に更新しています。
  • where() で、更新する行を特定しています。この場合、users_table.c.name == 'Alice'で、名前が’Alice’である行を指定しています。

5. データの削除

不要なデータを削除する場合も、SQLAlchemyの操作は非常にシンプルです。以下のコードは、特定のユーザーを削除する例です。

from sqlalchemy import delete

# データの削除
delete_stmt = delete(users_table).where(users_table.c.name == 'Alicia')
session.execute(delete_stmt)
session.commit()
  • delete() 関数を使って、users_tableからnameが’Alicia’の行を削除しています。
  • session.commit() で、変更を確定します。

まとめ

本記事では、Panelを使用してデータベースと統合するための基本的な流れを紹介しました。SQLAlchemyを使うことで、データベースの接続、データの挿入、取得、更新、削除が簡単に行えるようになります。次回は、HoloViewsを使ったインタラクティブなデータ可視化について解説します。

コメント

タイトルとURLをコピーしました