Skip to content

django-pgschemas

Packaging: poetry Build status Documentation status Code coverage PyPi version Downloads


This package uses Postgres schemas to support data multi-tenancy in a single Django project. Schemas are a layer of separation between databases and tables, so that one database can have multiple schemas, which in turn can have multiple (and possibly identical) tables. For an accurate description on schemas, see the official documentation on Postgres schemas.

Postgres uses a "search path" to denote in which schemas it should look for the appropriate tables. If there are three schemas: tenant1, common and public and the search path is set to ["tenant1", "public"], Postgres will look for tables first on schema tenant1, and then, if not found, will look on schema public. The tables on schema common would never be searched. Also, if there is a table with the same name on both tenant1 and public schemas (i.e. django_migrations), only the table in tenant1 will be found by that search path. Table creation always takes place on the first schema in the search path.

django-pgschemas, as well as its predecessors django-tenants and django-tenant-schemas, takes advantage of Postgres schemas to emulate multi-tenancy, by mapping an incoming HTTP request to a specific schema, and setting the search path accordingly. It also provides an API to change the search path outside the request/response cycle, in order to perform schema-specific tasks.