supabase


Namesupabase JSON
Version 2.10.0 PyPI version JSON
download
home_pagehttps://github.com/supabase/supabase-py
SummarySupabase client for Python.
upload_time2024-11-05 23:32:49
maintainerNone
docs_urlNone
authorJoel Lee
requires_python<4.0,>=3.9
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            # `supabase-py`

Python client for [Supabase](https://supabase.com)

- Documentation: [supabase.com/docs](https://supabase.com/docs/reference/python/introduction)
- Usage:
  - [GitHub OAuth in your Python Flask app](https://supabase.com/blog/oauth2-login-python-flask-apps)
  - [Python data loading with Supabase](https://supabase.com/blog/loading-data-supabase-python)

## Set up a Local Development Environment

### Clone the Repository

```bash
git clone https://github.com/supabase/supabase-py.git
cd supabase-py
```

### Create and Activate a Virtual Environment

We recommend activating your virtual environment. For example, we like `poetry` and `conda`! Click [here](https://docs.python.org/3/library/venv.html) for more about Python virtual environments and working with [conda](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#activating-an-environment) and [poetry](https://python-poetry.org/docs/basic-usage/).

Using venv (Python 3 built-in):

```bash
python3 -m venv env
source env/bin/activate  # On Windows, use .\env\Scripts\activate
```

Using conda:

```bash
conda create --name supabase-py
conda activate supabase-py
```

### PyPi installation

Install the package (for Python >= 3.9):

```bash
# 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 editable, so when you edit the source code the changes will be reflected in your python module.

## Usage

Set your Supabase environment variables in a dotenv file, or using the shell:

```bash
export SUPABASE_URL="my-url-to-my-awesome-supabase-instance"
export SUPABASE_KEY="my-supa-dupa-secret-supabase-api-key"
```

Init client:

```python
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.

### Sign-up

```python
user = supabase.auth.sign_up({ "email": users_email, "password": users_password })
```

### Sign-in

```python
user = supabase.auth.sign_in_with_password({ "email": users_email, "password": users_password })
```

### Insert Data

```python
data = supabase.table("countries").insert({"name":"Germany"}).execute()

# Assert we pulled real data.
assert len(data.data) > 0
```

### Select Data

```python
data = supabase.table("countries").select("*").eq("country", "IL").execute()

# Assert we pulled real data.
assert len(data.data) > 0
```

### Update Data

```python
data = supabase.table("countries").update({"country": "Indonesia", "capital_city": "Jakarta"}).eq("id", 1).execute()
```

### Update data with duplicate keys

```python
country = {
  "country": "United Kingdom",
  "capital_city": "London" # This was missing when it was added
}

data = supabase.table("countries").upsert(country).execute()
assert len(data.data) > 0
```

### Delete Data

```python
data = supabase.table("countries").delete().eq("id", 1).execute()
```

### Call Edge Functions

```python
def test_func():
  try:
    resp = supabase.functions.invoke("hello-world", invoke_options={'body':{}})
    return resp
  except (FunctionsRelayError, FunctionsHttpError) as exception:
    err = exception.to_dict()
    print(err.get("message"))
```

### Download a file from Storage

```python
bucket_name: str = "photos"

data = supabase.storage.from_(bucket_name).download("photo1.png")
```

### Upload a file

```python
bucket_name: str = "photos"
new_file = getUserFile()

data = supabase.storage.from_(bucket_name).upload("/user1/profile.png", new_file)
```

### Remove a file

```python
bucket_name: str = "photos"

data = supabase.storage.from_(bucket_name).remove(["old_photo.png", "image5.jpg"])
```

### List all files

```python
bucket_name: str = "charts"

data = supabase.storage.from_(bucket_name).list()
```

### Move and rename files

```python
bucket_name: str = "charts"
old_file_path: str = "generic/graph1.png"
new_file_path: str = "important/revenue.png"

data = supabase.storage.from_(bucket_name).move(old_file_path, new_file_path)
```


## Roadmap

- [x] Wrap [Postgrest-py](https://github.com/supabase/postgrest-py/)
  - [x] Add remaining filters
  - [x] Add support for EXPLAIN
  - [ ] Add proper error handling
  - [x] Use `sanitize_param()` to sanitize inputs.
  - [x] Fix client-side timeouts for long running queries.
  - [x] Enable HTTP2 by default.
  - [x] Enable follow redirects by default.
  - [x] Enable keep-alive by default.
  - [x] Enable running with unverified SSL via `verify=False`.
  - [x] Add Stalebot.
  - [x] Update CI (linters, etc).
  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).

- [ ] Wrap [Realtime-py](https://github.com/supabase/realtime-py)
  - [ ] Integrate with Supabase-py
  - [ ] Support WALRUS
  - [ ] Support broadcast (to check if already supported)
  - [x] Add `close()` method to close a socket.
  - [x] Add Stalebot.
  - [x] Update CI (linters, etc).
  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).

- [x] Wrap [auth-py](https://github.com/supabase/auth-py)
  - [x] Remove references to GoTrue-js v1 and do a proper release
  - [ ] Test and document common flows (e.g. sign in with OAuth, sign in with OTP)
  - [ ] Add MFA methods
  - [x] Add SSO methods
  - [x] Add Proof Key for Code Exchange (PKCE) methods. Unlike the JS library, we do not currently plan to support Magic Link (PKCE). Please use the [token hash](https://supabase.com/docs/guides/auth/server-side/email-based-auth-with-pkce-flow-for-ssr#create-api-endpoint-for-handling-tokenhash) in tandem with `verifyOTP` instead.
  - [x] Add `is_anonymous` boolean property.
  - [x] Add `sign_in_with_id_token()` method.
  - [x] Add `sign_in_with_sso()` method.
  - [x] Enable HTTP2 by default.
  - [x] Enable follow redirects by default.
  - [x] Enable keep-alive by default.
  - [x] Enable running with unverified SSL via `verify=False`.
  - [x] Add Stalebot.
  - [x] Update CI (linters, etc).
  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).

- [x] Wrap [storage-py](https://github.com/supabase/storage-py)
  - [ ] Support resumable uploads
  - [x] Setup testing environment
  - [x] Fix client-side timeouts for long running operations.
  - [x] Enable HTTP2 by default.
  - [x] Enable follow redirects by default.
  - [x] Enable keep-alive by default.
  - [x] Enable running with unverified SSL via `verify=False`.
  - [x] Add Stalebot.
  - [x] Update CI (linters, etc).
  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).
  - [x] Document how to properly upload different file types (e.g. jpeg/png and download it)

- [x] Wrap [functions-py](https://github.com/supabase/functions-py)
  - [x] Fix client-side timeouts for long running functions.
  - [x] Enable HTTP2 by default.
  - [x] Enable follow redirects by default.
  - [x] Enable keep-alive by default.
  - [x] Enable running with unverified SSL via `verify=False`.
  - [x] Add Regions support.
  - [x] Add Stalebot.
  - [x] Update CI (linters, etc).
  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).


### Overall Tasks

- [x] Add async support across the entire library
- [ ] Add FastAPI helper library (external to supabase-py)
- [ ] Add `django-supabase-postgrest` (external to supabase-py)

## Contributing

Contributing to the Python libraries are a great way to get involved with the Supabase community. Reach out to us on [Discord](https://discord.supabase.com) or on our [Github Discussions](https://github.com/orgs/supabase/discussions) page if you want to get involved.

### 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, which is populated with the following table:

<p align="center">
  <img width="720" height="481" src="https://i.ibb.co/Bq7Kdty/db.png">
</p>

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

```bash
./test.sh
```

## Badges

[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?label=license)](https://opensource.org/licenses/MIT)
[![CI](https://github.com/supabase/supabase-py/actions/workflows/ci.yml/badge.svg)](https://github.com/supabase/supabase-py/actions/workflows/ci.yml)
[![Python](https://img.shields.io/pypi/pyversions/supabase)](https://pypi.org/project/supabase)
[![Version](https://img.shields.io/pypi/v/supabase?color=%2334D058)](https://pypi.org/project/supabase)
[![Codecov](https://codecov.io/gh/supabase/supabase-py/branch/develop/graph/badge.svg)](https://codecov.io/gh/supabase/supabase-py)
[![Last commit](https://img.shields.io/github/last-commit/supabase/supabase-py.svg?style=flat)](https://github.com/supabase/supabase-py/commits)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/supabase/supabase-py)](https://github.com/supabase/supabase-py/commits)
[![Github Stars](https://img.shields.io/github/stars/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py/stargazers)
[![Github Forks](https://img.shields.io/github/forks/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py/network/members)
[![Github Watchers](https://img.shields.io/github/watchers/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py)
[![GitHub contributors](https://img.shields.io/github/contributors/supabase/supabase-py)](https://github.com/supabase/supabase-py/graphs/contributors)


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/supabase/supabase-py",
    "name": "supabase",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": "Joel Lee",
    "author_email": "joel@joellee.org",
    "download_url": "https://files.pythonhosted.org/packages/7f/31/656c8c271b7da5104d2fcda0d7c53c95c6ba009f5d708f598784efb1573b/supabase-2.10.0.tar.gz",
    "platform": null,
    "description": "# `supabase-py`\n\nPython client for [Supabase](https://supabase.com)\n\n- Documentation: [supabase.com/docs](https://supabase.com/docs/reference/python/introduction)\n- Usage:\n  - [GitHub OAuth in your Python Flask app](https://supabase.com/blog/oauth2-login-python-flask-apps)\n  - [Python data loading with Supabase](https://supabase.com/blog/loading-data-supabase-python)\n\n## Set up a Local Development Environment\n\n### Clone the Repository\n\n```bash\ngit clone https://github.com/supabase/supabase-py.git\ncd supabase-py\n```\n\n### Create and Activate a Virtual Environment\n\nWe recommend activating your virtual environment. For example, we like `poetry` and `conda`! Click [here](https://docs.python.org/3/library/venv.html) for more about Python virtual environments and working with [conda](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#activating-an-environment) and [poetry](https://python-poetry.org/docs/basic-usage/).\n\nUsing venv (Python 3 built-in):\n\n```bash\npython3 -m venv env\nsource env/bin/activate  # On Windows, use .\\env\\Scripts\\activate\n```\n\nUsing conda:\n\n```bash\nconda create --name supabase-py\nconda activate supabase-py\n```\n\n### PyPi installation\n\nInstall the package (for Python >= 3.9):\n\n```bash\n# with pip\npip install supabase\n\n# with conda\nconda install -c conda-forge supabase\n```\n\n### Local installation\n\nYou can also install locally after cloning this repo. Install Development mode with `pip install -e`, which makes it editable, so when you edit the source code the changes will be reflected in your python module.\n\n## Usage\n\nSet your Supabase environment variables in a dotenv file, or using the shell:\n\n```bash\nexport SUPABASE_URL=\"my-url-to-my-awesome-supabase-instance\"\nexport SUPABASE_KEY=\"my-supa-dupa-secret-supabase-api-key\"\n```\n\nInit client:\n\n```python\nimport os\nfrom supabase import create_client, Client\n\nurl: str = os.environ.get(\"SUPABASE_URL\")\nkey: str = os.environ.get(\"SUPABASE_KEY\")\nsupabase: Client = create_client(url, key)\n```\n\nUse the supabase client to interface with your database.\n\n### Sign-up\n\n```python\nuser = supabase.auth.sign_up({ \"email\": users_email, \"password\": users_password })\n```\n\n### Sign-in\n\n```python\nuser = supabase.auth.sign_in_with_password({ \"email\": users_email, \"password\": users_password })\n```\n\n### Insert Data\n\n```python\ndata = supabase.table(\"countries\").insert({\"name\":\"Germany\"}).execute()\n\n# Assert we pulled real data.\nassert len(data.data) > 0\n```\n\n### Select Data\n\n```python\ndata = supabase.table(\"countries\").select(\"*\").eq(\"country\", \"IL\").execute()\n\n# Assert we pulled real data.\nassert len(data.data) > 0\n```\n\n### Update Data\n\n```python\ndata = supabase.table(\"countries\").update({\"country\": \"Indonesia\", \"capital_city\": \"Jakarta\"}).eq(\"id\", 1).execute()\n```\n\n### Update data with duplicate keys\n\n```python\ncountry = {\n  \"country\": \"United Kingdom\",\n  \"capital_city\": \"London\" # This was missing when it was added\n}\n\ndata = supabase.table(\"countries\").upsert(country).execute()\nassert len(data.data) > 0\n```\n\n### Delete Data\n\n```python\ndata = supabase.table(\"countries\").delete().eq(\"id\", 1).execute()\n```\n\n### Call Edge Functions\n\n```python\ndef test_func():\n  try:\n    resp = supabase.functions.invoke(\"hello-world\", invoke_options={'body':{}})\n    return resp\n  except (FunctionsRelayError, FunctionsHttpError) as exception:\n    err = exception.to_dict()\n    print(err.get(\"message\"))\n```\n\n### Download a file from Storage\n\n```python\nbucket_name: str = \"photos\"\n\ndata = supabase.storage.from_(bucket_name).download(\"photo1.png\")\n```\n\n### Upload a file\n\n```python\nbucket_name: str = \"photos\"\nnew_file = getUserFile()\n\ndata = supabase.storage.from_(bucket_name).upload(\"/user1/profile.png\", new_file)\n```\n\n### Remove a file\n\n```python\nbucket_name: str = \"photos\"\n\ndata = supabase.storage.from_(bucket_name).remove([\"old_photo.png\", \"image5.jpg\"])\n```\n\n### List all files\n\n```python\nbucket_name: str = \"charts\"\n\ndata = supabase.storage.from_(bucket_name).list()\n```\n\n### Move and rename files\n\n```python\nbucket_name: str = \"charts\"\nold_file_path: str = \"generic/graph1.png\"\nnew_file_path: str = \"important/revenue.png\"\n\ndata = supabase.storage.from_(bucket_name).move(old_file_path, new_file_path)\n```\n\n\n## Roadmap\n\n- [x] Wrap [Postgrest-py](https://github.com/supabase/postgrest-py/)\n  - [x] Add remaining filters\n  - [x] Add support for EXPLAIN\n  - [ ] Add proper error handling\n  - [x] Use `sanitize_param()` to sanitize inputs.\n  - [x] Fix client-side timeouts for long running queries.\n  - [x] Enable HTTP2 by default.\n  - [x] Enable follow redirects by default.\n  - [x] Enable keep-alive by default.\n  - [x] Enable running with unverified SSL via `verify=False`.\n  - [x] Add Stalebot.\n  - [x] Update CI (linters, etc).\n  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).\n\n- [ ] Wrap [Realtime-py](https://github.com/supabase/realtime-py)\n  - [ ] Integrate with Supabase-py\n  - [ ] Support WALRUS\n  - [ ] Support broadcast (to check if already supported)\n  - [x] Add `close()` method to close a socket.\n  - [x] Add Stalebot.\n  - [x] Update CI (linters, etc).\n  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).\n\n- [x] Wrap [auth-py](https://github.com/supabase/auth-py)\n  - [x] Remove references to GoTrue-js v1 and do a proper release\n  - [ ] Test and document common flows (e.g. sign in with OAuth, sign in with OTP)\n  - [ ] Add MFA methods\n  - [x] Add SSO methods\n  - [x] Add Proof Key for Code Exchange (PKCE) methods. Unlike the JS library, we do not currently plan to support Magic Link (PKCE). Please use the [token hash](https://supabase.com/docs/guides/auth/server-side/email-based-auth-with-pkce-flow-for-ssr#create-api-endpoint-for-handling-tokenhash) in tandem with `verifyOTP` instead.\n  - [x] Add `is_anonymous` boolean property.\n  - [x] Add `sign_in_with_id_token()` method.\n  - [x] Add `sign_in_with_sso()` method.\n  - [x] Enable HTTP2 by default.\n  - [x] Enable follow redirects by default.\n  - [x] Enable keep-alive by default.\n  - [x] Enable running with unverified SSL via `verify=False`.\n  - [x] Add Stalebot.\n  - [x] Update CI (linters, etc).\n  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).\n\n- [x] Wrap [storage-py](https://github.com/supabase/storage-py)\n  - [ ] Support resumable uploads\n  - [x] Setup testing environment\n  - [x] Fix client-side timeouts for long running operations.\n  - [x] Enable HTTP2 by default.\n  - [x] Enable follow redirects by default.\n  - [x] Enable keep-alive by default.\n  - [x] Enable running with unverified SSL via `verify=False`.\n  - [x] Add Stalebot.\n  - [x] Update CI (linters, etc).\n  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).\n  - [x] Document how to properly upload different file types (e.g. jpeg/png and download it)\n\n- [x] Wrap [functions-py](https://github.com/supabase/functions-py)\n  - [x] Fix client-side timeouts for long running functions.\n  - [x] Enable HTTP2 by default.\n  - [x] Enable follow redirects by default.\n  - [x] Enable keep-alive by default.\n  - [x] Enable running with unverified SSL via `verify=False`.\n  - [x] Add Regions support.\n  - [x] Add Stalebot.\n  - [x] Update CI (linters, etc).\n  - [x] Check cyclomatic complexity and fix if needed (mccabe, prospector).\n\n\n### Overall Tasks\n\n- [x] Add async support across the entire library\n- [ ] Add FastAPI helper library (external to supabase-py)\n- [ ] Add `django-supabase-postgrest` (external to supabase-py)\n\n## Contributing\n\nContributing to the Python libraries are a great way to get involved with the Supabase community. Reach out to us on [Discord](https://discord.supabase.com) or on our [Github Discussions](https://github.com/orgs/supabase/discussions) page if you want to get involved.\n\n### Running Tests\n\nCurrently, 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, which is populated with the following table:\n\n<p align=\"center\">\n  <img width=\"720\" height=\"481\" src=\"https://i.ibb.co/Bq7Kdty/db.png\">\n</p>\n\nThe 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\n\n```bash\n./test.sh\n```\n\n## Badges\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?label=license)](https://opensource.org/licenses/MIT)\n[![CI](https://github.com/supabase/supabase-py/actions/workflows/ci.yml/badge.svg)](https://github.com/supabase/supabase-py/actions/workflows/ci.yml)\n[![Python](https://img.shields.io/pypi/pyversions/supabase)](https://pypi.org/project/supabase)\n[![Version](https://img.shields.io/pypi/v/supabase?color=%2334D058)](https://pypi.org/project/supabase)\n[![Codecov](https://codecov.io/gh/supabase/supabase-py/branch/develop/graph/badge.svg)](https://codecov.io/gh/supabase/supabase-py)\n[![Last commit](https://img.shields.io/github/last-commit/supabase/supabase-py.svg?style=flat)](https://github.com/supabase/supabase-py/commits)\n[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/supabase/supabase-py)](https://github.com/supabase/supabase-py/commits)\n[![Github Stars](https://img.shields.io/github/stars/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py/stargazers)\n[![Github Forks](https://img.shields.io/github/forks/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py/network/members)\n[![Github Watchers](https://img.shields.io/github/watchers/supabase/supabase-py?style=flat&logo=github)](https://github.com/supabase/supabase-py)\n[![GitHub contributors](https://img.shields.io/github/contributors/supabase/supabase-py)](https://github.com/supabase/supabase-py/graphs/contributors)\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Supabase client for Python.",
    "version": "2.10.0",
    "project_urls": {
        "Documentation": "https://github.com/supabase/supabase-py",
        "Homepage": "https://github.com/supabase/supabase-py",
        "Repository": "https://github.com/supabase/supabase-py"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "108dec1dd5f1e17dd51e358809adfceafa0a78f32f171d33b9cbe38bb5eac8a3",
                "md5": "bb584eea066bd72551c635c629dbe536",
                "sha256": "183fb23c04528593f8f81c24ceb8178f3a56bff40fec7ed873b6c55ebc2e420a"
            },
            "downloads": -1,
            "filename": "supabase-2.10.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bb584eea066bd72551c635c629dbe536",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.9",
            "size": 16626,
            "upload_time": "2024-11-05T23:32:46",
            "upload_time_iso_8601": "2024-11-05T23:32:46.429135Z",
            "url": "https://files.pythonhosted.org/packages/10/8d/ec1dd5f1e17dd51e358809adfceafa0a78f32f171d33b9cbe38bb5eac8a3/supabase-2.10.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7f31656c8c271b7da5104d2fcda0d7c53c95c6ba009f5d708f598784efb1573b",
                "md5": "45e6f082944f756a41c66b7a55dbc709",
                "sha256": "9ac095f8947bf60780e67c0edcbab53e2db3f6f3f022329397b093500bf2607c"
            },
            "downloads": -1,
            "filename": "supabase-2.10.0.tar.gz",
            "has_sig": false,
            "md5_digest": "45e6f082944f756a41c66b7a55dbc709",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.9",
            "size": 13909,
            "upload_time": "2024-11-05T23:32:49",
            "upload_time_iso_8601": "2024-11-05T23:32:49.223684Z",
            "url": "https://files.pythonhosted.org/packages/7f/31/656c8c271b7da5104d2fcda0d7c53c95c6ba009f5d708f598784efb1573b/supabase-2.10.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-05 23:32:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "supabase",
    "github_project": "supabase-py",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "lcname": "supabase"
}
        
Elapsed time: 0.35679s