Files
supabase/apps/docs/content/troubleshooting/using-sqlalchemy-with-supabase-FUqebT.mdx
TheOtherBrian1 d87904961e Cleaning up troubleshooting guide categories (Edge Functions) (#43834)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES/NO

## What kind of change does this PR introduce?

Docs update

## What is the current behavior?

Many troubleshooting guides referencing Postgres functions were placed
in the edge function category

## What is the new behavior?

Removed the "function" topic filter for guides that are unrelated to
edge functions
2026-03-17 21:36:53 -04:00

91 lines
3.9 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title = "Using SQLAlchemy with Supabase"
github_url = "https://github.com/orgs/supabase/discussions/27071"
date_created = "2024-06-06T16:27:43+00:00"
topics = [ "database", "supavisor", "self-hosting" ]
keywords = [ "sqlalchemy", "ipv6", "pool", "database", "connection" ]
database_id = "da4efcda-cd02-4001-965b-f0294300152f"
---
## Deploying to auto-scaling servers:
If you are deploying to:
- edge functions
- serverless functions
- horizontally auto-scaling deployments
It is recommended that you connect with the pooler in transaction mode (port 6543), which can be found on the dashboard by clicking [Connect](/dashboard/project/_?showConnect=true&method=transaction).
```sh
# Example transaction mode string:
postgres://[db-user].[project-ref]:[db-password]@aws-0-[aws-region].pooler.supabase.com:6543
```
When using transaction mode, you should use the[ `NullPool` setting:](https://docs.sqlalchemy.org/en/20/core/pooling.html#switching-pool-implementations)
```py
from sqlalchemy.pool import NullPool
con = sqlalchemy.create_engine(url, client_encoding='utf8', poolclass=NullPool)
```
When relying on Supavisor, it's important to pick an adequate pool size. This guide can walk you through the process:
- https://github.com/orgs/supabase/discussions/21566
## Deploying to stationary servers
For stationary servers, such as VMs and long-running containers, it is recommended to use your direct connection string, which can be found on the dashboard by clicking [Connect](/dashboard/project/_?showConnect=true).
```
# Example DB string:
postgresql://postgres:[PASSWORD]@db.[PROJECT REF].supabase.co:5432/postgres
```
The connection maps to an IPv6 address, and cannot operate in an IPv4 environment.
### Checking IPv6 support:
The majority of services are IPv6 compatible. However, there are a few prominent services that only accept IPv4 connections:
- [Retool](https://retool.com/)
- [Vercel](https://vercel.com/)
- [GitHub Actions](https://docs.github.com/en/actions)
- [Render](https://render.com/)
If you're still unsure if your network supports IPv6, you can run this cURL command on your deployment server:
```sh
curl -6 https://ifconfig.co/ip
```
If the command returns an IPv6 address, the network is IPv6 compatible.
If your deployment environment is not IPv6 compatible, then consider:
- Using the Supavisor pooler in session (port 5432)
- Enabling the [IPv4 Add-On](/dashboard/project/_/settings/addons) if you're on a pro or above plan
### Choosing an internal pool size
**Key Pool Settings:**
- pool_size: This sets the maximum number of permanent connections in the pool. SQLAlchemy will create connections as needed up to this limit.
max_overflow: Allows creating additional connections beyond pool_size for temporary bursts in demand. These temporary connections close after use.
```python
# Example configurations
engine = create_engine(
   "postgresql+psycopg2://me@localhost/mydb", pool_size=20, max_overflow=15
)
```
As a rule of thumb, if you're using the Supabase Database REST Client, try to limit the connections used by your deployment to 40% of available connections. Otherwise, you can cautiously increase usage to around 80%. These percentages are flexible and depend on your application's usage and setup. Monitor connection usage to determine the optimal allocation without depriving other servers of necessary connections.
## How to monitor live connections
Connection usage can be monitored with a Supabase Grafana Dashboard. It provides realtime visibility of over 200 database metrics, such as graphs of CPU, EBS, and active direct/pooler connections. It can be extremely useful for monitoring and debugging instances.
You can check our [GitHub repo](https://github.com/supabase/supabase-grafana) for setup instructions for local deployments or free cloud deployments on [Fly.io](http://fly.io/). For a complete explainer on connection monitoring, you can check out this [guide](https://github.com/orgs/supabase/discussions/27141)