Python

SupaBaseのAPIをPython経由で操作する

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

 

スポンサーリンク
スポンサーリンク

はじめに

 

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を使用するには、まず無料アカウントを作成し、プロジェクトを作成する必要があります。

  1. SupaBaseの公式サイトにアクセスし、アカウントを作成。
  2. ダッシュボードで新規プロジェクトを作成。
  3. プロジェクトの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;
-- ↑ポリシーによって追加された行

 

このように、ユーザーによってアクセスできるリソースの範囲を制限することができるらしいです。

 

参考:https://zenn.dev/ulxsth/scraps/2d9f9bebaf39c8

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操作や認証機能を簡単に扱えるため、バックエンド開発を効率化できます。さらに、クエリの直接実行やテーブル作成も可能であり、柔軟なデータ管理が可能です

 

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

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