Contents
はじめに
SupaBaseは、オープンソースのFirebase代替として注目されているBaaS(Backend as a Service)です。Pythonを用いてSupaBaseのAPIを操作することで、データベースの読み書きや認証機能を簡単に扱うことができます。本記事では、Pythonを使ってSupaBaseのAPIを操作する方法を解説します。
基本的には公式のAPIドキュメントをなぞっているだけなので回りくどいという方は直接公式ドキュメントを読んでください↓
APIドキュメント:https://supabase.com/docs/reference/python/initializing
環境準備
必要なライブラリのインストール
SupaBaseのAPIを操作するためには、supabase
ライブラリを使用します。以下のコマンドでインストールしましょう。
pip install supabase
また、requests
ライブラリを利用する場合もあるので、併せてインストールしておきます。
pip install requests
SupaBaseのプロジェクトセットアップ
SupaBaseを使用するには、まず無料アカウントを作成し、プロジェクトを作成する必要があります。
- SupaBaseの公式サイトにアクセスし、アカウントを作成。
- ダッシュボードで新規プロジェクトを作成。
- プロジェクトのAPIキーとURLを取得。
PythonでSupaBaseのAPIを操作する
1. APIクライアントのセットアップ
まず、取得したAPIキーとURLを用いて、Pythonスクリプト内でSupaBaseクライアントをセットアップします。
from supabase import create_client, Client
SUPABASE_URL = "https://your-project-id.supabase.co"
SUPABASE_KEY = "your-anon-key"
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
補足:APIについて
SUPABASEでもAWSやGCPなどと違ってURL と API キーさえあれば、 HTTP リクエストを介して API にアクセスできるようになっている。また公式が提供するクライアントライブラリを使用することが多くPython以外でも基本的に公式のライブラリを使えばすぐ実装できるのが良い点なのですが、便利故にセキュリティなどをちゃんとしないとインシデントが起こりやすいので実務で取り扱う際は注意しましょう
API URL
すべての supabase プロジェクトには、固有の URL が発行される。これは supabase の各機能へアクセスするために使われる。(参照)
https://<project_ref>.supabase.co
API Key
すべての supabase プロジェクトには、anon
キーと service_role
キーが2種類が発行されます。
これら二つの違いは、後述する RLS (Row Level Security、行レベルセキュリティ) と対応しており、内部的には Postgres のユーザーに対応しているとのこと。また、これも後述する ポリシー によって、各キーのアクセス範囲を設定できる。
anon
デフォルトで、ほとんど権限を持たないキー。
クライアント側からの限定的なアクセスを行うために用意されていると思われSELECTでデータの読み取りなどは可能だが編集系の処理は権限エラーで実行できないようになっている
service_role
サービス内のさまざまなタスクを実行するためのキー。こちらは RLS を迂回できるため、取り扱いには十分に注意する必要があります。またanonは書き込みや削除の権限を持たないためバックエンドでアプリからデータベースに接続してCRUD処理を行う場合はこちらのAPI鍵を設定する必要があります。また言わずもがなですが、CRUDができるのでGitHubに誤ってキーを公開してしまうととんでもないことになります
RLS (Row Level Security, 行レベルセキュリティ)
文字通り テーブルの一行レベルでアクセス制限を行う 機能のこと。うまく利用すれば、データベースレベルでリソースのアクセス管理ができ、サービス内でのセキュリティが高まる。Snowflakeとかで使われているやつですね
この機能は、テーブルを作成した時点で自動的に有効になる。(参照)逆に言えば、この機能をオフにすることによって、 anon
キーからのアクセスであってもすべてのリソースにアクセスすることができる。が、これはセキュリティ的にとてもまずいので(プロダクトでは絶対に)おすすめしない。
ポリシー
RLS を有効にしているとき、テーブルに対して ポリシー を適用できる。これは各ユーザーに対するアクセス制限を表すルールで、開発者は必要なポリシーを必要なだけ設定することで、不必要なアクセス許可を防ぐ(=予期しないリソースの流出を防ぐ)ことができる。
公式ドキュメントでは、以下のような例が挙げられている。todo アプリの中で、ユーザーは他人の todo にアクセスする必要はない(できたら問題である)。そのため、ユーザーが todo を取得するときは、自身の uid
に合致する行しかアクセスできないようにする。
-- ユーザーが自分の todo にだけアクセスできるようにする
create policy "Individuals can view their own todos."
on todos for select
using ( (select auth.uid()) = user_id );
これは、言い換えると 「SELECT句を使用したとき、自動的にWHERE句を追加する」 ということ。
select *
from todos
where auth.uid() = todos.user_id;
-- ↑ポリシーによって追加された行
このように、ユーザーによってアクセスできるリソースの範囲を制限することができるらしいです。
2. データの追加(INSERT)
テーブルにデータを追加するには、以下のようにします。
# データの挿入
response = supabase.table("users").insert({
"name": "Taro Yamada",
"email": "taro@example.com",
"age": 30
}).execute()
print(response)
3. データの取得(SELECT)
データを取得するには、select()
を使用します。
response = supabase.table("users").select("*").execute()
print(response)
特定の条件でフィルタリングすることも可能です。
response = supabase.table("users").select("name, email").eq("age", 30).execute()
print(response)
4. データの更新(UPDATE)
update()
を使用してデータを更新できます。
response = supabase.table("users").update({"age": 31}).eq("name", "Taro Yamada").execute()
print(response)
5. データの削除(DELETE)
データを削除する場合は、delete()
を使用します。
response = supabase.table("users").delete().eq("name", "Taro Yamada").execute()
print(response)
クエリを直接実行する
SupaBaseでは、SQLクエリを直接実行することも可能です。
query = "SELECT * FROM users WHERE age > 25"
response = supabase.rpc("sql", {"query": query}).execute()
print(response)
この方法を使えば、より高度なクエリも実行できます。
テーブルの作成
SupaBaseのREST API経由でテーブルを作成するには、管理画面から実行するのが一般的ですが、SQLクエリを使ってプログラム経由で作成することも可能です。
query = """ CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, age INT ); """ response = supabase.rpc("sql", {"query": query}).execute() print(response)
まとめ
本記事では、SupaBaseのAPIをPython経由で操作する方法を解説しました。データのCRUD操作や認証機能を簡単に扱えるため、バックエンド開発を効率化できます。さらに、クエリの直接実行やテーブル作成も可能であり、柔軟なデータ管理が可能です
コメント