こんにちは、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)や列を定義します。IntegerやStringなどのデータ型を指定できます。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_tableにname='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を使ったインタラクティブなデータ可視化について解説します。


コメント