はじめに
Livebook はブラウザ上で Elixir や Erlang などのコードを実行し、結果を視覚化できるツールです
Python における Jupyter に相当します
Livebook のはじめ方はこちら
Livebook には Smart Cell という機能があり、これを使うことで AI・機械学習や画像処理、グラフ表示など、様々なことが ノーコードで簡単に実装できるようになっています
今回は KinoDB を使って、 Elixir を(ほぼ)書かずにデータベース操作する手順を紹介します
実装したノートブックはこちら
環境の準備
Livebook と PostgreSQL をローカル起動している場合はそのまま進めて問題ありません
コンテナで起動したい場合、こちらの記事を参考にしてください
ノートブックの作成
Livebook のホーム画面、右上の + New notebook
をクリックします
新しいノートブックが開きます
セットアップ
Notebook dependencies and setup
と書いてある枠(セットアップセル)をクリックし、その中に以下のコードを入力します
Mix.install([
{:kino_db, "~> 0.2"},
{:postgrex, "~> 0.17"}
])
これにより、 KinoDB と Postgrex が依存モジュールとしてインストールされます
KinoDB はデータベース用の Smart Cell (DB接続とクエリ実行用の UI)を提供しています
Postgrex が KinoDB の裏で PostgreSQL との接続、データベース操作を実行しています
データベース接続
データベース接続用 Smart Cell の追加
Section
と書いてある行と黒い枠(セル)の間、横方向中央あたりにマウスカーソルを持っていくと、 + Elixir
+ Block
+ Smart
という3つのボタンが表示されます
+ Smart
をクリックするとドロップダウンが出てくるので、 Database connection
をクリックします
すると、以下のようなデータベース接続用の入力フォームが表示されます
データベース接続情報の入力
各項目に接続先データベースの情報を入力します
コンテナ起動している場合、 Hostname はコンテナ名を指定してください
(上記 docker compose 定義の場合、 postgres_for_livebook
)
Password は秘密情報のため、テキスト入力をクリックするとモーダルが表示されます
Name に適当な名前(DB_PASSWORD
など)、 Value にパスワードを入力し、 + Add
ボタンをクリックしてください
接続情報を全て入力したら Smart Cell 左上の Evaluate
をクリックしましょう
Smart Cell の下に {:ok, #PID<0.276.0>}
という出力が表示されれば接続できています
クエリ実行
クエリ実行用 Smart Cell の追加
データベース接続の結果の下、横方向中央あたりにマウスカーソルを移動すると、再び + Smart
のボタンが表示されるので、ドロップダウンから SQL query
をクリックします
すると、以下のような Smart Cell が追加されます
Smart Cell からのクエリ実行
黒い枠の中を以下のように変更して、左上の Evaluate
をクリックしましょう
CREATE TABLE
sample
(
id integer,
name varchar(20)
)
実行結果が以下のように表示されます
もう一つ Smart Cell を追加して、今度は以下のような INSERT 文を実行してみましょう
INSERT INTO
sample
(
id,
name
)
VALUES
(
1,
'John'
)
RETURNING
id
RETURNING に書いた id が結果として返ってきました
最後に以下の SELECT 文を実行します
SELECT
*
FROM
sample
実行結果がテーブルとして表示されました
Smart Cell のコード化
Livebook では Smart Cell をコード化することができます
Smart Cell が裏でやっていることを確認してみましょう
データベース接続用 Smart Cell の右上にある鉛筆アイコンをクリックします
以下のような警告モーダルが表示されるので、 Convert
をクリックします
すると、 Smart Cell が以下のコードセルに変換されます
opts = [
hostname: "postgres_for_livebook",
port: 5432,
username: "postgres",
password: System.fetch_env!("LB_DB_PASSWORD"),
database: "postgres"
]
{:ok, conn} = Kino.start_child({Postgrex, opts})
実態としては Kino.start_child
で Postgrex を別プロセスで起動していることが分かります
また、 password は秘密情報なので、 LB_DB_PASSWORD
という環境変数で渡しています
次にクエリ実行の Smart Cell をコード化すると、以下のようになります
result =
Postgrex.query!(
conn,
"""
CREATE TABLE
sample
(
id integer,
name varchar(20)
)
""",
[]
)
データベース接続のセルで作成した接続 conn
を指定し、 Postgrex のプロセス経由でクエリを実行しています
まとめ
KinoDB を使うことで、データベース接続、クエリ実行をノーコードで実装できました
また、クエリの結果は自動的にテーブル表示されるため、結果の UI について考える必要もありません
Livebook からデータベース操作をしたい場合、 KinoDB を活用しましょう