supabase-py
Supabase client for Python. This mirrors the design of supabase-js
Status | Stability | Goal |
---|---|---|
✅ | Alpha | We are testing Supabase with a closed set of customers |
✅ | Public Alpha | Anyone can sign up over at app.supabase.io. But go easy on us, there are a few kinks. |
🚧 | Public Beta | Stable enough for most non-enterprise use-cases |
❌ | Public | Production-ready |
We are currently in Public Alpha. Watch "releases" of this repo to get notified of major updates.
Installation
Recomended: First activate your virtual environment, with your favourite system. For example, we like poetry
and conda
!
PyPi installation
Now install the package. (for > Python 3.7)
# with pip
pip install supabase
# with conda
conda install -c conda-forge supabase
Local installation
You can also install locally after cloning this repo. Install Development mode with pip install -e
, which makes it so when you edit the source code the changes will be reflected in your python module.
Usage
It's usually best practice to set your api key environment variables in some way that version control doesn't track them, e.g don't put them in your python modules! Set the key and url for the supabase instance in the shell, or better yet, use a dotenv file. Heres how to set the variables in the shell.
export SUPABASE_URL="my-url-to-my-awesome-supabase-instance"
export SUPABASE_KEY="my-supa-dupa-secret-supabase-api-key"
We can then read the keys in the python source code.
import os
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_URL")
key: str = os.environ.get("SUPABASE_KEY")
supabase: Client = create_client(url, key)
Use the supabase client to interface with your database.
Running Tests
Currently the test suites are in a state of flux. We are expanding our clients tests to ensure things are working, and for now can connect to this test instance, that is populated with the following table:
The above test database is a blank supabase instance that has populated the countries
table with the built in countries script that can be found in the supabase UI. You can launch the test scripts and point to the above test database by running
./test.sh
See issues for what to work on
Rough roadmap:
- Wrap Postgrest-py
- Wrap Realtime-py
- Wrap Gotrue-py
- Wrap storage-py
- Wrap functions-py
Client Library
Authenticate
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
# Create a random user login email and password.
random_email: str = "3hf82fijf92@supamail.com"
random_password: str = "fqj13bnf2hiu23h"
user = supabase.auth.sign_up(email=random_email, password=random_password)
Sign-in
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
# Sign in using the user email and password.
random_email: str = "3hf82fijf92@supamail.com"
random_password: str = "fqj13bnf2hiu23h"
user = supabase.auth.supabase.auth.sign_in_with_password({ "email": random_email, "password": random_password })
Managing Data
Insertion of Data
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
data = supabase.table("countries").insert({"name":"Germany"}).execute()
assert len(data.data) > 0
Selection of Data
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
data = supabase.table("countries").select("*").eq("country", "IL").execute()
# Assert we pulled real data.
assert len(data.data) > 0
Update of Data
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
data = supabase.table("countries").update({"country": "Indonesia", "capital_city": "Jakarta"}).eq("id", 1).execute()
Deletion of Data
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
data = supabase.table("countries").delete().eq("id", 1).execute()
Supabase Functions
from supabase import create_client, Client
url: str = os.environ.get("SUPABASE_TEST_URL")
key: str = os.environ.get("SUPABASE_TEST_KEY")
supabase: Client = create_client(url, key)
func = supabase.functions()
@asyncio.coroutine
async def test_func(loop):
resp = await func.invoke("hello-world",invoke_options={'body':{}})
return resp
loop = asyncio.get_event_loop()
resp = loop.run_until_complete(test_func(loop))
loop.close()
Realtime Changes
Realtime changes are unfortunately still a WIP. Feel free to file PRs to realtime-py
See Supabase Docs for full list of examples